C как из xmldocument получить класс
Перейти к содержимому

C как из xmldocument получить класс

  • автор:

Получение данных подклассов XML C#

Получить значение span title, data-img_key Проблема заключается в том что все классы начинаются с td, тем самым я не могу добраться до нужного подкласса tr Использую код для получения значение id в классе td

XmlDocument doc = new XmlDocument(); doc.Load("xmltext.xml"); foreach(XmlNode node in doc.DocumentElement) < string name = node.Attributes[0].Value;>> 

Отслеживать
29k 5 5 золотых знаков 28 28 серебряных знаков 55 55 бронзовых знаков
задан 5 июн 2018 в 7:40
Егор Глухов Егор Глухов
170 16 16 бронзовых знаков
Возможный дубликат вопроса: Как распарсить HTML в .NET?
5 июн 2018 в 7:42

Используйте запросы selectSingleNode или selectNodes . эти два ф-ции есть во многих редакциях xml. Ну и читать XPath-запросы.

5 июн 2018 в 7:44

Уважаемый, вы уже 2-ой вопрос задаете и не как не можете понять одно. Вы изобретаете велосипед и воспринимаете HTML как XML , да, HTML построен на XML , но это два разных формата со своими тонкостями. Зачем изобретать что то, если есть куча отличных вариантов (которые вам уже 2-ой вопрос подряд советуют)?

5 июн 2018 в 8:01

По поводу обновлённого вопроса. Ваш первый foreach — перебирает елементы первого уровня. Что б добраться до элеменотов второго уровня — нужен ещё один foreach — обойти деток.

5 июн 2018 в 9:09

Вот пример, чуть другой способ, но более нажёжный перебора ru.stackoverflow.com/a/84406/17974 если вас именно перебор интерисует.

C как из xmldocument получить класс

Для работы с XML в C# можно использовать несколько подходов. В первых версиях фреймворка основной функционал работы с XML предоставляло пространство имен System.Xml . В нем определен ряд классов, которые позволяют манипулировать xml-документом:

  • XmlNode : представляет узел xml. В качестве узла может использоваться весь документ, так и отдельный элемент
  • XmlDocument : представляет весь xml-документ
  • XmlElement : представляет отдельный элемент. Наследуется от класса XmlNode
  • XmlAttribute : представляет атрибут элемента
  • XmlText : представляет значение элемента в виде текста, то есть тот текст, который находится в элементе между его открывающим и закрывающим тегами
  • XmlComment : представляет комментарий в xml
  • XmlNodeList : используется для работы со списком узлов

Ключевым классом, который позволяет манипулировать содержимым xml, является XmlNode , поэтому рассмотрим некоторые его основные методы и свойства:

  • Свойство Attributes возвращает объект XmlAttributeCollection , который представляет коллекцию атрибутов
  • Свойство ChildNodes возвращает коллекцию дочерних узлов для данного узла
  • Свойство HasChildNodes возвращает true , если текущий узел имеет дочерние узлы
  • Свойство FirstChild возвращает первый дочерний узел
  • Свойство LastChild возвращает последний дочерний узел
  • Свойство InnerText возвращает текстовое значение узла
  • Свойство InnerXml возвращает всю внутреннюю разметку xml узла
  • Свойство Name возвращает название узла. Например, — значение свойства Name равно «user»
  • Свойство ParentNode возвращает родительский узел у текущего узла

Применим эти классы и их функционал. И вначале для работы с xml создадим новый файл. Назовем его people.xml и определим в нем следующее содержание:

   Microsoft 37  Google 41   

Теперь пройдемся по этому документу и выведем его данные на консоль:

using System.Xml; XmlDocument xDoc = new XmlDocument(); xDoc.Load("people.xml"); // получим корневой элемент XmlElement? xRoot = xDoc.DocumentElement; if (xRoot != null) < // обход всех узлов в корневом элементе foreach (XmlElement xnode in xRoot) < // получаем атрибут name XmlNode? attr = xnode.Attributes.GetNamedItem("name"); Console.WriteLine(attr?.Value); // обходим все дочерние узлы элемента user foreach (XmlNode childnode in xnode.ChildNodes) < // если узел - company if (childnode.Name == "company") < Console.WriteLine($"Company: "); > // если узел age if (childnode.Name == "age") < Console.WriteLine($"Age: "); > > Console.WriteLine(); > >

В итоге я получу следующий вывод на консоли:

Tom Company: Microsoft Age: 37 Bob Company: Google Age: 41

Чтобы начать работу с документом xml, нам надо создать объект XmlDocument и затем загрузить в него xml-файл: xDoc.Load(«people.xml»);

При разборе xml для начала мы получаем корневой элемент документа с помощью свойства xDoc.DocumentElement . Далее уже происходит собственно разбор узлов документа.

В цикле foreach(XmlNode xnode in xRoot) пробегаемся по всем дочерним узлам корневого элемента. Так как дочерние узлы представляют элементы , то мы можем получить их атрибуты: XmlNode attr = xnode.Attributes.GetNamedItem(«name»); и вложенные элементы: foreach(XmlNode childnode in xnode.ChildNodes)

Чтобы определить, что за узел перед нами, мы можем сравнить его название: if(childnode.Name==»company»)

Подобным образом мы можем создать объекты классов и структур по данным из xml:

using System.Xml; var people = new List(); XmlDocument xDoc = new XmlDocument(); xDoc.Load("people.xml"); // получим корневой элемент XmlElement? xRoot = xDoc.DocumentElement; if (xRoot != null) < foreach (XmlElement xnode in xRoot) < Person person = new Person(); XmlNode? attr = xnode.Attributes.GetNamedItem("name"); person.Name = attr?.Value; foreach (XmlNode childnode in xnode.ChildNodes) < if (childnode.Name == "company") person.Company = childnode.InnerText; if (childnode.Name == "age") person.Age = int.Parse(childnode.InnerText); >people.Add(person); > foreach (var person in people) Console.WriteLine($" () - "); > class Person < public string? Name < get; set; >public int Age < get; set; >public string? Company < get; set; >>

В данном случае определен класс Person с тремя свойствами. При переборе узлов файла xml значения элементов и их атрибутов передается объекту класса Person.

Консольный вывод программы:

Tom (Microsoft) - 37 Bob (Google) - 41

Xml Document. Load Xml(String) Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Загружает XML-документ из указанной строки.

public: virtual void LoadXml(System::String ^ xml);
public virtual void LoadXml (string xml);
abstract member LoadXml : string -> unit override this.LoadXml : string -> unit
Public Overridable Sub LoadXml (xml As String)
Параметры

Строка, содержащая загружаемый XML-документ.

Исключения

Ошибка загрузки или синтаксического анализа в XML. В этом случае документ остается пустым.

Примеры

В следующем примере XML загружается XmlDocument в объект и сохраняется в файл.

#using using namespace System; using namespace System::Xml; int main() < // Create the XmlDocument. XmlDocument^ doc = gcnew XmlDocument; doc->LoadXml( "wrench" ); // Add a price element. XmlElement^ newElem = doc->CreateElement( "price" ); newElem->InnerText = "10.95"; doc->DocumentElement->AppendChild( newElem ); // Save the document to a file and auto-indent the output. XmlTextWriter^ writer = gcnew XmlTextWriter( "data.xml", nullptr ); writer->Formatting = Formatting::Indented; doc->Save( writer ); > 
using System; using System.Xml; public class Sample < public static void Main() < // Create the XmlDocument. XmlDocument doc = new XmlDocument(); doc.LoadXml("wrench"); // Add a price element. XmlElement newElem = doc.CreateElement("price"); newElem.InnerText = "10.95"; doc.DocumentElement.AppendChild(newElem); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; // Save the document to a file and auto-indent the output. XmlWriter writer = XmlWriter.Create("data.xml", settings); doc.Save(writer); > > 
Imports System.Xml public class Sample public shared sub Main() ' Create the XmlDocument. Dim doc as XmlDocument = new XmlDocument() doc.LoadXml("wrench") ' Add a price element. Dim newElem as XmlElement = doc.CreateElement("price") newElem.InnerText = "10.95" doc.DocumentElement.AppendChild(newElem) Dim settings As New XmlWriterSettings() settings.Indent = True ' Save the document to a file and auto-indent the output. Dim writer As XmlWriter = XmlWriter.Create("data.xml", settings) doc.Save(writer) end sub end class 

Комментарии

По умолчанию LoadXml метод не сохраняет пробелы или значительные пробелы.

Этот метод анализирует определения типов документов (DTD), но не выполняет проверку DTD или схемы. Если требуется выполнить проверку, можно создать проверяющий XmlReader экземпляр с помощью XmlReaderSettings класса и Create метода . Дополнительные сведения см. в подразделе «Примечания» на справочной странице XmlReader.

Если вы хотите загрузить из Stream, String, TextReaderили XmlReader, используйте метод Load вместо этого метода.

Этот метод является расширением Майкрософт для модели DOM.

Чтение XML с помощью класса XmlDocument

Как описано в предыдущей главе, подход с использованием XmlDocument занимает больше памяти и возможно немного медленнее, чем подход с использованием XmlReader. Однако во многих случаях XmlDocument может быть легче в использовании и часто требует написания меньшего количества кода. Как только содержимое XML будет прочитано, вы можете считать данные в виде иерархии, прямо как XML-структура, с корневым элементом, который может содержать дочерние элементы, которые в свою очередь также могут иметь дочерние элементы и так далее. В предыдущей главе мы парсили XML-данные из Европейского Центрального Банка с курсами валют, и сейчас мы сделаем тоже самое, только с помощью класса XmlDocument.

XML можно найти на следующей URL (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml), данные, которые нам нужны, находятся в элементах . В древовидной структуре это выглядит примерно следующим образом:

 
[other child nodes]




gesmes:Envelope — наш корневой элемент, который можно получить через свойство DocumentElement. После этого мы сможем получить доступ к дочерним элементам этого узла через свойство-коллекцию ChildNodes. В нашем примере нам нужны дочерние элементы на три уровня ниже корневого. Мы можем сделать это с помощью следующего кода, который в сущности такой же, как основанный на XmlReader код из предыдущей главы:

using System;
using System.Text;
using System.Xml;

namespace ParsingXml
class Program
static void Main(string[] args)
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml");
foreach(XmlNode xmlNode in xmlDoc.DocumentElement.ChildNodes[2].ChildNodes[0].ChildNodes)
Console.WriteLine(xmlNode.Attributes["currency"].Value + ": " + xmlNode.Attributes["rate"].Value);
Console.ReadKey();
>
>
>

Как видите, мы получили узлы Cube, спускаясь по иерархии дочерних элементов ChildNodes. Из элемента DocumentElement (не корневого элемента) мы запросили дочерний узел третьего уровня (индексация уровней начинается с нуля), затем мы запросили его первый дочерний узел, и затем мы запросили коллекцию дочерних узлов. Разумеется это возможно только потому что мы знаем структуру документа XML, и это определенно не очень гибко, красиво и не очень просто изменяется в дальнейшем. Однако способ, которым вы пользуетесь для навигации по XML-документу, очень сильно зависит от источника XML и данных, которые вам нужны. В этом примере код, описанный выше, будет отлично работать и даже не потребует написания большого кода, но в других случаях, вы можете захотеть написать немного больше кода для повышения читабельности.

Как только мы получаем узел с курсом валюты, мы получаем доступ к двум свойствам, которые нам нужны, и затем выводим их в консоль, как в примере в предыдущей главе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *