Получение данных подклассов 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 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. Как вывести в определенном узле элементы без их дочерних элементов?
Мне нужно считать только элементы относящиеся непосредственно к элементу «Klassi», т.е. значения всех элементов «klass», но у меня выходит, что считываются и подэлементы. Вот такое пошлый вывод мне удается получить:
«Класс 1 Класс 2 Класс 3 Класс 4 Класс 5 Класс7АБВ». Да не надо мне АБВ, нужно только номера классов и все. Издевательство чистой воды, коллеги! Помогите, пожалуйста!
Вот мой код:
XmlDocument doc = new XmlDocument(); doc.Load("C:\\Gruppi.xml"); XmlNodeList nodeList = doc.SelectNodes("head/Klassi/klass"); listBox1.Items.Clear(); foreach (XmlNode node in nodeList)
P.s. Не знаю уже куда взвывать!
- Вопрос задан более трёх лет назад
- 163 просмотра
DOM — Объектная модель документа для работы с XML файлами
В состав библиотеки базовых классов (BCL) платформы .NET Framework входит сборка System.Xml.dll, в которой хранится реализация технологии DOM.
XML DOM (Document Object Model)
DOM (Объектная модель документа) — это не зависящий от платформы и языка интерфейс, который позволяет получать доступ к XML файлам, изменять их структуру и содержимое.
Представляет содержимое файла XML в виде дерева узлов хранимое в памяти компьютера.
Принцип работы DOM
Для начала работы необходимо подключить в свой проект пространство имён: System.XML. Обычно оно подключается автоматически при создании проекта.
![]()
Основная работа с XML файлами осуществляться благодаря dll сборке System.Xml, которая предоставляет для работы с DOM все необходимые типы и члены.
Создание файла XML
Вне зависимости от типа задачи, любая работа с DOM, начинается с построения виртуального файла XML в памяти компьютера, точнее сказать каркаса будущего файла. В платформе .NET данную задачу решает класс XMLDocument. Для этого необходимо создать объект данного класса.
XmlDocument xmlDoc = new XmlDocument();
Открытие файла XML
После того, как виртуальный файл (каркас) создан. Можно перейти к работе с физическим файлом XML. Физический файл — это файл, который храниться на жёстком диске. Для работы с физическим файлом, применяется метод Load(), всё того же класса XMLDocument.
Load();
Данный метод открывает и считывает данные из физического файла в виртуальный файл. Тем самым, создавая точную копию нашего физического файла, в памяти компьютера.
Пример создания создания виртуального файла.
using System; using System.Xml; using System.IO; namespace Lessons < class Auto < static void Main() < string xmlPath = @"C:\lessons\auto.xml"; //Создание файла в памяти XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(xmlPath)) < //загружаем данные из физического файла xmlDoc.Load(xmlPath); >> > >
После того, как был создан виртуальный файл в памяти компьютера, Вы можете начать работать с ним, как с обычным физическим файлом. То есть выполнять любые обычные операции: добавлять, изменять, удалять данные в файле XML и многое другое.
При этом надо помнить, что все изменения затрагивать виртуальный файл, а не физический!
Сохранение в XML файл
После того, как проделаны все необходимые операции над виртуальным файлом, необходимо выполнить выгрузку или сохранение данных в физический файл. Чтобы внести изменения в физический файл используется метод Save(), всё того же класса XMLDocument.
Save();
Следующий пример демонстрирует, как можно сохранить или выгрузить данные в физический XML файл.
using System; using System.Xml; using System.IO; namespace Lessons < class Auto < static void Main() < string xmlPath = @"C:\lessons\auto.xml"; XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(xmlPath)) < xmlDoc.Load(xmlPath); //Выполняем, какие-нибудь действия. >xmlDoc.Save(xmlPath); > > >

Как видно DOM, очень затратный в плане ресурсов инструмент для работы с XML документами. Независимо от количества записей в файле, мы сначала будем считывать все содержимое в память компьютера, а затем все эти данные сохранять обратно в этот же файл. При этом, производиться перезапись всего содержимое файла, вне зависимости от количества внесенных данных или изменений.
Узлы (Node)
Для дальнейшей работы нам понадобиться создать XML файл, который мы будем использовать в качестве примера.
Mazda 2007 BMW 2009
Весь XML файл – это один объект, который можно представить в виде дерева узлов. Под узлом можно понимать любое содержимое файла XML, будь-то декларация, комментарий, элементы и другое. То есть нужно запомнить, что к чему бы мы не обращались в XML файле, с точки зрения DOM, будет являться узлом (Node). Один узёл может содержать любое количество элементов.
Если наш, выше описанный пример, представить в виде дерева, то получим следующее:

Типы узлов
Дерево представляет собой столб, под которым подразумевается корневой (root) элемент, в нашем случаи – это элемент “garage”. Все узлы крепятся к данному столбу, как ветки у дерева. Так как узлов может быть много, они делятся на типы, вот некоторые из них:
| DOCUMENT | документ | document |
| ELEMENT | элемент | |
| ATTRIBUTE | атрибут элемента | id="1" |
| TEXT | текстовый узел | текст |
| COMMENT | комментарий |
В .NET Framework, для получения типа узла применяется класс Xml Node Type. А в свою очередь, для каждого типа есть свой класс для работы с ним.
Типы узлов и классы для работы с нимиXml Node Type .NET Framework Class
| Document | XmlDocument |
| Document Type | XmlDocumentType |
| Element | XmlElement |
| Attribute | XmlAttribute |
| Text | XmlText |
| Entity | XmlEntity |
| Comment | XmlComment |
Корневой элемент
Как упоминалось ранее, корневой элемент является столбом, к которому крепятся узлы.
Для того, чтобы научиться передвигаться по дереву, необходимо для начала получить в нашем коде root-элемент, от которого мы будем отталкиваться, для достижения нужного узла.
Получение корневого элемента:
using System; using System.Xml; using System.IO; namespace Lessons < class Auto < static void Main() < string xmlPath = @"C:\lessons\auto.xml"; XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(xmlPath)) < xmlDoc.Load(xmlPath); //корневой элемент XmlElement elmRoot = xmlDoc.DocumentElement; Console.WriteLine(elmRoot.Name); >> > >
В результате выполнения данного кода, на экран будет выведено слово «garage», которое является именем нашего root-элемента. То есть доступ к корневому элементу был получен, и теперь отталкиваясь от этой точки, мы может перемещаться по дереву и получать нужные нам данные, а так же добавлять новые узлы в наше дерево, но об этом более подробно в следующей статье.
- Удаление колонки в DataGridView
- c# работа с элементом управления TreeView
- WebBrowser работа с html атрибутами