Работаем с LINQ to XML. Знакомство с современными средствами работы с XML

08.05.2019

Уже довольно много времени прошло с тех пор, как я пообещал рассказать о работе с данными в формате XML при разработке.NET-приложений. Обещания надо выполнять. Прошу только учесть, что эта статья ориентирована не на профессиональных.NET-разработчиков, а на тех, кто ещё не имеет существенного опыта создания.NET-приложений.


Зачем нам работать с XML?

Если вы ещё не очень хорошо представляете себе, что такое XML, то рекомендую прочитать статью "XML - это всерьёз и надолго" в "КВ" № за 2007-й год. Чтобы сэкономить место для более важных вещей, здесь сам формат XML разбираться не будет.

Перед тем, как начинать знакомиться с программным кодом, нужно ответить на один принципиальный вопрос: зачем вообще включать поддержку XML в своё приложение? Думаю, что многие задавали себе этот вопрос относительно многих технологий, и не все после ответа были включены в приложения. Впрочем, с XML дело обстоит несколько иначе, и существуют реальные поводы использовать этот формат во многих ситуациях.

Главное преимущество XML в том, что, будучи по природе текстовым форматом, он, тем не менее, прекрасно позволяет хранить и передавать любые данные. Поскольку этот формат текстовый, то сама собой решается проблема его кросс-платформенности, и точно так же легко решается проблема передачи XML-данных (как это, например, сделано в SOAP). Кроме того, можно без проблем изменять формат передачи или хранения данных, добавляя новые атрибуты и не сильно беспокоясь о совместимости с предыдущими версиями формата, поскольку приложения, использующие старую версию, смогут прочитать то, что им надо, не обращая внимания на новые теги или атрибуты. Многие приложения используют основанные на XML файловые форматы, многие протоколы передачи данных тоже основаны на XML, и списки тех и других продолжают расти.

Конечно, с другой стороны, XML не очень экономичен, потому что, как когда-то верно заметил один из посетителей форума "Компьютерных вестей", часто XML-документы состоят на 10% из данных и на 90% из тегов. Впрочем, это уже в значительной степени зависит от того, какие вы сами выберете теги. Можно написать ул. Мельникайте, 2, а можно . Хотя, если честно, мне кажется, что с нынешними винчестерами и толстыми каналами нет смысла особенно ужиматься.

Так что в умелых руках XML - вещь мощная и удобная, а из-за повсеместной распространённости этого формата от него и вовсе никуда не денешься. Поэтому давайте перейдём уже к написанию программного кода.

Для программирования мы будем использовать основной язык платформы.NET - C#. Для того, чтобы как можно больше читателей могли сами поупражняться с приведенным программным кодом, я буду использовать первую версию C# и.NET Framework"а.


Запись данных

Сначала поговорим о записи данных, поскольку, сами понимаете, чтобы что-то откуда-то считывать, нужно сначала что-то куда-то и записать. А коль скоро мы с вами занялись программированием, то создавать XML-данные "ручками" нам с вами не пристало. Поэтому давайте сначала займёмся записью данных в XML.

Для начала создайте новый проект в Visual Studio, #Develop"е или C# Builder"е, и в список импортируемых namespace"ов добавьте System.Xml.

За запись XML-данных в.NET Framework"е отвечает специальный класс XmlTextWriter, который позволяет записывать XML-данные в произвольный поток. То есть, мы, вообще говоря, можем записать их с его помощью и в файл, и в базу данных, и отправить кому-то через Интернет, однако сейчас мы будем писать всё именно в файл. Вы можете перенаправить вывод, изменив конструктор объекта (т.е. передав при инициализации не имя файла и его кодировку, а объект, являющийся потоком данных). Впрочем, я, кажется, уже стал забегать немного вперёд. Давайте сначала познакомимся с кодом, ответственным за запись данных в наш с вами XML-файл.

String FileName = "c:\\demo.xml"; XmlTextWriter xml = new XmlTextWriter(FileName, System.Text.Encoding.Unicode); xml.Formatting = Formatting.Indented; xml.WriteStartDocument(); xml.WriteStartElement("rootelement"); for (int i = 0; i < 10; i++) { xml.WriteStartElement("subelement"); xml.WriteAttributeString("attrib1", "value1"); xml.WriteAttributeString("attrib2", i.ToString()); for (int j = 0; j < 10; j++){ xml.WriteStartElement("subsubelement"); xml.WriteAttributeString("attr", j.ToString()); xml.WriteEndElement(); } xml.WriteEndElement(); } xml.WriteEndElement(); xml.WriteEndDocument(); xml.Close();

Первая строка, думаю, вполне ясна - это просто запись имени файла, в который мы будем сохранять данные. Дальше мы создаём объект типа XmlTextWriter (он называется, как видите, xml), и именно с ним мы будем производить все дальнейшие операции. Заметьте, что при конструировании объекта мы указываем и кодировку, в которой будет записываться XML: в нашем примере это Unicode. Следующая строчка, вообще говоря, не обязательна, однако она сделает наш XML-документ, что называется, human readable, то есть добавит нужные отступы и разобьёт его на строки. Без этого весь документ был бы записан одной строкой, что, хотя и экономит место, но делает его практически непригодным для ручного редактирования.

Начинается запись документа с вызова метода WriteStartDocument() нашего объекта xml. Следующая за ней строчка добавляет корневой элемент "rootelement" в наш XML-документ (напомню, для XML-документов корневой элемент должен присутствовать в единственном экземпляре). Далее мы в цикле добавляем ещё десять не несущих никакой смысловой нагрузки элементов в наш с вами XML-документ, для каждого из которых устанавливаем два атрибута и ещё по десять подэлементов. Обратите внимание, что мы можем добавлять к строке число без явной конвертации данных, а вот если число должно целиком образовывать строку, то его нужно преобразовывать явно методом ToString(). Также обратите внимание, что мы должны явно закрывать каждый из элементов нашего XML-документа, а также потом и весь документ целиком.

Теперь, когда наш XML-документ успешно записан, давайте посмотрим, каким образом можно считать из него данные.


Чтение данных

Добавьте на форму вашего приложения (если, конечно, оно у вас не консольное) компонент listBox для того, чтобы можно было следить за результатом чтения XML-файла. Ну а если ваша программа консольная , то вы с лёгкостью сможете перенаправить вывод на консоль.

Как обычно, сначала ознакомимся с кодом программы, а потом уже будем смотреть, что именно этот код делает.

XmlTextReader xml = new XmlTextReader(FileName); xml.WhitespaceHandling = WhitespaceHandling.None; int i = 0; while (xml.Read()){ if ((xml.NodeType == XmlNodeType.Element) & (xml.Name == "subelement")) { listBox1.Items.Add("subelement " + i + " found"); i++; listBox1.Items.Add(" " + xml.GetAttribute("attrib1")); listBox1.Items.Add(" " + xml.GetAttribute("attrib2")); while (xml.Read()&(xml.Name == "subsubelement")){ listBox1.Items.Add(" " + xml.GetAttribute("attr")); } } } xml.Close();

Для чтения, как вы могли заметить, мы используем уже другой класс, а именно - XmlTextReader. Он находится в том же пространстве имён, что и класс, который мы использовали для записи данных. В первой строчке мы создаём экземпляр XmlTextReader"а, имеющий имя xml (здесь мы предполагаем, что переменная FileName уже определена нами ранее). Чтобы пропускать пустые строки, ежели такие неким непостижимым образом возникнут в нашем только что созданном XML-файле, мы используем следующую строку в приведенном фрагменте кода. Переменная i используется для подсчёта количества найденных элементов "subelement" в XML-файле, из которого производится считывание данных.

Дальше идёт цикл непосредственного чтения данных из файла. Метод Read() считывает следующий элемент XML-документа, и после его считывания мы проверяем, что именно мы считали. Если это действительно элемент "subelement", то мы добавляем информацию о считанном элементе в listBox1, инкрементируем переменную, содержащую количество считанных элементов, а затем считываем атрибуты элемента. После чтения атрибутов мы организуем отдельный цикл для чтения подэлементов "subsubelement" (обратите внимание, что для этого нам не требуется отдельного XmlTextReader"а) и атрибутов этих подэлементов. Как и ранее, все считанные сведения мы заносим в listBox1, чтобы контролировать правильность чтения.

При чтении XML-файлов, точно так же, как и при их записи, при конструировании XmlTextReader"а можно указать в качестве параметра поток, из которого будет производиться чтение, и тогда читать можно будет не только из файлов, но также и из других источников, примеры которых я уже приводил выше. Следует отметить одну полезную особенность класса XmlTextReader: при чтении он не загружает в память весь читаемый XML-документ, поэтому с его помощью удобно проводить разбор больших XML-документов (например, XML баз данных).


За кадром

В общем-то, пример, который мы с вами только что разобрали, чересчур прост для реальных проектов. В наше время при чтении XML-документов, как правило, применяется их валидация с помощью DTD, XML Schema или Relax NG. Валидация - это проверка соответствия разметки XML-документа некоторому стандарту, описываемому во внешнем файле. Валидация нужна для того, чтобы проверка документа не была жёстко зашита в алгоритм программы, а могла изменяться произвольным образом при изменении в формате данных без обновления считывающего или записывающего данные программного кода. К сожалению, сейчас мы с вами уже разобрать валидацию не успеем, поскольку, как вы сами понимаете, объём газетной статьи имеет определённые ограничения.

Ещё один интересный и полезный практический момент, касающийся работы с XML-данными, - это XSL-преобразование данных. Это преобразование применяется к данным при их отображении на HTML-страницах и, фактически, просто является применением определённого шаблона web-страницы к XML-файлу с какими-либо данными. Поскольку львиная доля теперешнего использования XML-данных так или иначе приходится на World Wide Web, то и XSL-преобразования рассмотреть было бы очень и очень неплохо.

Так что, думаю, у этой статьи будет продолжение - но, конечно, только в том случае, если вы сами (то есть читатели "Компьютерных вестей") об этом попросите на форуме или в письме на мой электронный почтовый адрес. Пока же об использовании XML в.NET-приложениях, пожалуй, всё. Надеюсь, что эта информация будет полезной для вас.

Работа с данными в формате XML в приложениях ASP.NET 2.0, объект XmlDataDocument и элемент управления XML

Этот модуль посвящен тому, как можно работать с данными в формате XML из приложений ASP.NET.

XML расшифровывается как Extensible Markup Language (расширяемый язык разметки), хотя сам XML - это не язык. XML - набор правил, используемых для создания своих языков разметки. Например, представим себе, что у нас существуют такие данные о сотруднике:

Эти данные, конечно, можно представить как угодно: в виде таблицы в реляционной базе данных, в виде таблицы Excel или HTML, в виде таблицы в документе Word или в виде текстового документа ASCII, в виде файла *.csv и т.п. Если мы представим их в формате придуманного нами XML-совместимого языка разметки ABML (Address Book Markup Language), то они будут выглядеть так:

Александр Иванов

Невский пр , д .1

Санкт - Петербург

555-55-55

Немного о том, как расшифровать этот код. Первые две строки - это пролог (использовать его, в принципе, необязательно, но очень рекомендуется). Строка

называется объявлением XML (XML Declaration) и говорит о том, что этот файл соответствует спецификации XML 1.0, принятой в качестве рекомендации World Wide Web Consortium 10 февраля 1998 года. Строка

называется определением типа документа (Document Type Definition) и говорит о том, что структура языка, которому соответствует этот документ, описана в файле abml.dtd (можно использовать и внутренние DTD, когда описание языка находится прямо в документе). Сейчас для описания структуры XML-совместимых языков чаще используются не DTD, а XML Schema - к ним проще обращаться и они обеспечивают больше возможностей, в частности, при описании различных типов данных. Эта же строка с использованием XML Schema может выглядеть так:

в зависимости от того, где лежит сама Schema - описание данного языка - в файле abml.xml или на Web-сервере (корпоративное хранилище схем от Microsoft - BizTalk Server).

Пример XML Schema для нашего языка может выглядеть так:

xmlns="urn:schemas-astrosoft-ru:abml maxOccurs="*" />

XML – это формализованный набор правил для «разметки» документа – то есть выделения его логической структуры. То, что находится внутри любого документа, совместимого с форматом XML, можно разбить на две категории: разметку и само содержание. Вся информация о разметки должна начинаться либо с символа амперсанда (&), либо с символа левой угловой скобки (<). В XML существует шесть типов информации разметки: элементы, атрибуты, комментарии, инструкции обработки, ссылки на сущности и разделы CDATA.

· Элементы (elements) – это наиболее распространенный тип информации о разметке. Элемент выделяет логическую составную часть документа. Обычный документ состоит из открывающих и закрывающих тегов, которые могут окружать содержимое, другой элемент, или и то, и другое вместе. Теги с названиями элемента заключаются в угловые скобки. Вот пример элемента:

4296 Razor Hill Road

· Атрибуты (attributes) состоят из пары имя атрибута/значение атрибута и применяются к элементам. Атрибуты положено помещать после имени элемента в открывающем теге. Например, атрибутами являются ширина и высота:

· Комментарии (comments) – это любой текст, который будет игнорироваться процессором XML. Пример:

· Инструкции обработки (processing instructions) используются для передачи информации приложению, обрабатывающему документ XML. Синтаксис инструкции обработки выглядит так:

· Ссылки на сущности (entity references) используются для того, чтобы помещать в документ зарезервированные символы или зарезервированные слова. К примеру, нам надо вставить в документ левую угловую скобку (<), которая является зарезервированным символом XML. Просто так вставить в текст документа мы ее не сможем: приложение, работающее с документом, решит, что она относится к разметке. Поэтому нам необходимо использовать сочетание символов <. lt означает less than (меньше чем), а амперсанд (&) и точка с запятой (;) выделяют ссылку на сущность.

· Раздел CDATA (CDATA section) – это часть текста, которая не обрабатывается, как остальные части документа XML, а передаваться приложению напрямую. Это средство может пригодиться, например, при передаче приложению какого-либо кода.

Синтаксические принципы XML:

· Документы XML состоят из символов Unicode (Unicode – это 16-битный набор символов, который позволяет отображать документы на любых языках).

· XML чувствителен к регистру. Теги и в нем – это разные теги.

· Пустое пространство (whitespace) – это невидимые символы, такие, как пробел (ASCII 32), символ табуляции (ASCII 9), символы возврата каретки (ASCII 13) и символы перевода строки (ASCII 10). Пустое пространство игнорируется внутри тегов, но сохраняется в символьных данных (то есть между открывающим и закрывающим тегами). Пустое пространство в символьных данных передается обрабатывающему приложению.

· Многие компоненты XML должны иметь имена (наиболее наглядный пример – элементы и атрибуты). Правила именования XML выглядят следующим образом: имя XML должно начинаться с буквы или подчеркивания, за которым следует любое количество букв, цифр, дефисов, подчеркиваний или точек, например:

Мой_Уникальный_Идентификатор_Тега-123 2_Это_имя_является_неверным

· Имя компонента XML не может начинаться с символов xml (как в верхнем, так и в нижнем регистре). Такие имена зарезервированы создателями спецификации для служебных целей.

· Символьные значения должны быть помещены в одинарные или двойные кавычки.

· В XML должен строго соблюдаться порядок вложенности тегов.

· Любому открывающему тегу в XML должен соответствовать закрывающий тег.

· Пустой тег в XML записывается как открывающий тег, перед правой угловой скобкой в котором стоит прямой слеш (/).

· В документе XML может быть только один корневой элемент.

В чем преимущества размещения данных в XML перед традиционными двоичными форматами? Почему в настоящее время большинство крупных производителей программного обеспечения либо уже полностью перешли на работу с данными в XML-совместимом формате (например, Micrоsoft Office 2003), либо планируют перейти в ближайшем будущем? Главная причина - данные в XML очень легко передавать между самыми разными приложениями и их очень легко преобразовывать. Дополнительные моменты, связанные с преимуществами XML:

  • Независимый формат данных - данные в формате XML можно открывать в любом XML-совместимом (точнее, совместимым с конкретной схемой) приложении. Пример: на любом предприятии документы хранятся в самых разных форматах - форматах разных версий Word, текстовых, HTML, PDF и т.п. Проблем из-за этого возникает очень много, радикально решаются при помощи XML.
  • Общий принцип - один источник данных (документ XML), много представлений. Наглядно можно продемонстрировать на примере Web-сайта, к которому нужно обращаться из разных броузеров и через WAP.
  • Гораздо более простая передача данных "сквозь" приложения. Примеры - прохождение документов через цепочку поставщиков, или прохождение данных между разнородными программными продуктами на одном предприятии (что необходимо очень часто).
  • Улучшенные возможности поиска данных. Во-первых, нет необходимости обращаться к документам разных двоичных форматов, во-вторых, иерархическая структура документов XML облегчает поиск.
  • Более простая разработка приложений - нет необходимости реализовывать в приложениях поддержку большого количества разных двоичных форматов данных.
  • Данные в текстовом формате (стандарт XML - Unicode) проще, чем двоичные, хранить на различных платформах и безопаснее (с точки зрения отсутствия вредоносного двоичного кода) передавать в сетях. Целое направление в разработке приложений - XML Web-службы.

Well -formed XML - такой код XML , который соответствует требованиям синтаксиса этого языка (например, каждому открывающему тегу соответствует закрывающий тег). Valid XML - корректный с точки зрения логической структуры этого языка (например, элементы правильно вложены друг в друга), определенной в DTD или XML Schema .

Немного по терминологии XML, которая будет использоваться в этом курсе:

· XSD - XML Schema Definition , обычно используемое в VS .NET описание структуры документа XML. Обычно она размещается в файлах с расширением *.xsd. Внутри схемы используются специальные теги . Каждый элемент, помеченный таким префиксом, относится к XML Schema. Внутри XML Schema можно использовать пространства имен. Например, чтобы указать, что внутри схемы используются два пространства имен, относящихся к W 3C XML Schema и Microsoft Office 10 Data Schema , можно использовать тег

xmlns:od="urn:schemas-microsoft-com:officedata">

Чтобы внутри схемы определить строковый элемент Last Name, который может встречаться в документе 0 или больше раз, можно, например, использовать следующий тег:

type="string">

· для описания преобразований XML -совместимых документов используются документы на специальном языке программирования XSLT (eXtensible Stylesheet Language Transform). Сам этот язык, конечно, также является XML -совместимым. В XSLT используется три типа документов:

o документ-источник (source document). Этот документ XML "подается на вход" для преобразования. В нашем случае этот может быть такой документ:

xml-stylesheet type="text/xsl" href="Employees1.xsl "?>

Stuart Munson

Programmer

Robert Brown

Tester

o документ таблицы стилей XSLT (XSLT style sheet document) - XML-совместимый документ, в котором описываются правила проведения трансформаций. В нашем случае пример этого документа может быть таким:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform "

version="1.0 ">



o документ - результат преобразований. Например, при применении нашего преобразования имя сотрудника будет помечено красным, а его должность - синим.

· XPath - специальный язык, который можно использовать для навигации по дереву элементов XML . При использовании объектной модели XPath документ XML представляется в виде дерева узлов. Информация содержится в свойствах этих узлов.

· DOM (Document Object Model ) - представление дерева документа XML в оперативной памяти. DOM позволяет выполнять навигацию по документу XML и редактировать его. Стандартные свойства, методы и события DOM определены в документе, принятом W3C. В ASP.NET при помощи DOM можно создать документ XML и отправить его в броузер пользователю. Другой вариант - клиентский скрипт создает при помощи DOM документ XML на клиенте и передает его на Web-сервер.

· XQuery - это специализированный язык запросов к информации, которая хранится в документах XML . Работа XQuery во многом основана на XPath.

Надо сказать, что XML - это стандартный формат для работы с данными в ADO.NET. Про формат XML и как его можно использовать с DataSet - ниже.

Возможности использования XML при работе с DataSet такие:

· DataSet могут сериализовать данные в формате XML. Схема DataSet (включая таблицы, столбцы, типы данных и ограничения) определяется при этом в XML Schema (файл.xsd ).

· обмен данными из DataSet с удаленными клиентами предписывается производить в формате XML;

· XML можно использовать для синхронизации и преобразования данных в DataSet.

Еще немного про взаимодействие XML и DataSet:

· можно не только создавать XML Schema на основе DataSet (о чем говорилось выше, это делается при помощи метода WriteXmlSchema ), но и наоборот - генерировать DataSet на основе информации их XML Schema (для этого - метод ReadXmlSchema ). Есть возможность сгенерировать DataSet даже без схемы - просто на основе документа XML. Для этой цели предназначен метод InferXmlSchema.

· для объекта DataSet предусмотрен метод ReadXML , который позволяет считать текстовый документ XML (поток текстовых данных XML ) в DataSet . Другой метод, WriteXML , позволяет сохранять содержимое DataSet в XML-совместимом формате. Такая возможность позволяет очень просто организовывать обмен данными между различными приложениями и платформами.

· вы можете создать представление XML (объект XmlDataDocument ) на основе информации из DataSet . Получается, что с информацией в DataSet можно работать двумя способами: обычными реляционными (с самим DataSet) и XML-методами. Оба представления автоматически синхронизируются (при внесении изменений через любое представление).

· вы можете применять преобразования XSLT к данным, которые хранятся в DataSet .

Теперь - о том, как все это выглядит на практике.

Dim ds As New DataSet()

ds.ReadXml(Server.MapPath("filename.xml"))

Метод MapPath для специального объекта Server позволяет преобразовать виртуальный путь к файлу в Web-приложении в физический путь.

Будет ли сгенерирована структура DataSet автоматически из файла XML или она останется прежней, зависит от того, была ли она уже сформирована в этом DataSet и от того, был ли указан необязательный параметр метода ReadXml XmlReadMode.

Dim ds As New DataSet()

Dim da As New SqlDataAdapter(_

"select * from Authors", conn)

da.Fill(ds)

ds.WriteXml(Server.MapPath("filename.xml"))

Есть еще два метода, которые позволяют получить из DataSet данные в формате XML и положить их в строковую переменную. Это методы GetXml и GetXmlSchema. Пример может выглядеть так:

Dim strXmlDS As String = ds . GetXml ()

В DataSet часто помещаются объекты DataTable , связанные между собой отношениями DataRelation (то есть таблицы с Primary и Foreign key). При экспорте в XML информация из родительской таблицы может быть дополнена информацией из подчиненной таблицы. Записи из подчиненной таблицы будут выглядеть как вложенные элементы для записей из главной. Чтобы реализовать такую возможность, необходимо для объекта DataRelation в DataSet для свойства Nested установить значение True (по умолчанию False).

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

Dim ds As New DataSet()

’fill the DataSet

...

Dim parentCol As DataColumn = _

ds.Tables("Publishers").Columns("pub_id")

Dim childCol As DataColumn = _

ds.Tables("Titles").Columns("pub_id")

ds.Relations.Add(dr)

ds.WriteXml(Server.MapPath("PubTitlesNotNested.xml"), _

XmlWriteMode.IgnoreSchema)

Код XML получается такой:

title1

1

40.00

title2

2

60.00

title3

1

30.00

1

pub1

2

pub2

а теперь используем устанавливаем свойство Nested для объекта DataRelation в True:

Dim dr As New DataRelation _

("TitlePublishers", parentCol, childCol)

dr.Nested = True

ds.Relations.Add(dr)

ds.WriteXML(Server.MapPath("PubTitlesNested.xml"), _

XmlWriteMode . IgnoreSchema )

Код XML получается уже совсем другой. В каждый элемент типа Pub вложены элементы Titles, выпущенные этим издательством:

1

pub1

title1

1

40.00

title3

1

30.00

2

pub2

title2

2

60.00

XmlDataDocument - это XML -представление данных в DataSet в оперативной памяти. XmlDataDocument неразрывно связан с DataSet . Любые изменения, внесенные в XmlDataDocument , немедленно отражаются в DataSet и наоборот. Ниже будет рассказано о приемах работы с XmlDataDocument.

DataSet - это реляционное представление данных, а XmlDataDocument - иерархическое. Применение XmlDataDocument очень удобно, поскольку работать с данными в формате XML только через DataSet бывает сложно. Например, если загрузить данные из файла XML в DataSet, а затем выгрузить обратно, то вполне может получиться так, что файл будет неузнаваем: будет потеряно форматирование, вполне возможно - порядок элементов, возможно, элементы, которые были проигнорированы из-за несоответствия со схемой, определенной для DataSet.

В XmlDataDocument можно положить документ XML напрямую, а можно создать его на основе DataSet. Код для первого варианта может выглядеть так:

Dim objXmlDataDoc As New XmlDataDocument()

objXmlDataDoc.Load(Server.MapPath("file.xml"))

или так:

objXmlDataDoc.DataSet.ReadXml(Server.MapPath("file.xml"))

Разницы никакой не будет.

А можно вначале создать DataSet, заполнить его данными, а затем на основе его создать XmlDataDocument:

Dim ds As New DataSet()

’fill in ds

...

Dim objXmlDataDoc As New XmlDataDocument(ds)

После того, как объект XmlDataDocument создан, с ним можно выполнять различные действия:

· привязывать к DataGrid и другим элементам управления:

dg.DataSource = objXmlDataDoc.DataSet

· получать нужную строку (она возвращается в виде объекта XmlElement):

Dim elem As XmlElement

elem = objXmlDataDoc.GetElementFromRow _

(ds.Tables(0).Rows(1))

· использовать полный набор свойств и методов DOM. Эти свойства и методы XmlDataDocument наследует от объекта XmlDocument

· применять преобразования XSLT (для этой цели используются объекты XslTransform ).

Подробнее о преобразованиях средствами XSLT:

XSLT позволяет преобразовать исходный документ XML в другой документ, отличающийся по формату и структуре. Например, при помощи XSLT документ XML можно преобразовать к код HTML для отображения в Web-приложении. В ASP.NET для выполнения преобразований XSLT используется класс XslTransform .

Как выглядит работа с ним?

· для проведения преобразований вначале нужно создать DataSet и соответствующий ему XmlDataDocument :

Dim ds As New DataSet()

’fill in DataSet

...

Dim xmlDoc As New XmlDataDocument(ds)

· следующее действие - создаем объект XslTransform:

Dim xslTran As New XslTransform()

· используем метод Load этого объекта, чтобы загрузить в него преобразование:

xslTran.Load(Server.MapPath("PubTitles.xsl"))

· создаем объект XmlTextWriter (он будет использован для вывода результатов преобразования):

Dim writer As New XmlTextWriter _

(Server.MapPath("PubTitles_output.html"), _

System.Text.Encoding.UTF8)

· выполняем само преобразование при помощи метода Tr ansform объекта XslTransform . У этого метода - несколько вариантов. Один из вариантов его применения может выглядеть так:

xslTran.Transform(xmlDoc, Nothing, writer)

· закрываем объект Writer:

writer.Close()

Для работы с XML на Web -форме можно обойтись и совсем без объекта DataSet (и элементов управления, предназначенных для отображения данных из реляционного источника). Вместо этого можно использовать элемент управления XML Web Server Control . Он позволяет выводить на Web-странице сами документы XML или результаты их преобразований. Код XML можно передавать этому элементу управления разными способами:

· напрямую открывать их с диска (через свойство DocumentSource ). В этом случае (если вы не применили преобразования XSLT) документ XML будет выведен на форму "как есть":

XML Example

TransformSource="MyStyle.xsl" runat="server" />

· открывать их как объекты и передавать их этому элементу управления (через свойство Document ). В нашем случае XML Web Server Control называется Xml1 :

Private Sub Page_Load(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles MyBase.Load

Dim xmlDoc As System.Xml.XmlDocument = _

New System.Xml.XmlDocument()

xmlDoc.Load(Server.MapPath("MySource.xml"))

Dim xslTran As System.Xml.Xsl.XslTransform = _

New System.Xml.Xsl.XslTransform()

xslTran.Load(Server.MapPath("MyStyle.xsl"))

Xml1.Document = xmlDoc

Xml1.Transform = xslTran

End Sub

· просто программным образом генерировать код XML и передавать этот код XML Web Server Control (через свойство DocumentContent )

· вообще напрямую вписать код XML в тег XML Web Server Control:

Frank Miller

Judy Lew

· выполнить преобразование и передать ему результаты преобразования

Пример, который иллюстрирует все эти возможности, представлен ниже:

Document="XmlDocument object to display"

DocumentContent="String of XML"

DocumentSource="Path to XML Document"

Transform="XslTransform object"

TransformSource="Path to XSL Transform Document"

runat =" server ">

Добавить XML Web Server Control на Web -форму можно просто перетаскиванием этого элемента управления из ToolBox или программно:

< asp : Xml id =" xmlCtl " runat =" server " />

XmlCtl . Document . Save (Server . MapPath (" xmlResult . xml "))

Структуризация данных – вещь полезная, и пригодится в самый неожиданный момент. Например, если структурировать свое ближайшее будущее, то можно увидеть размер своей зарплаты. И можно решить, с какой отдачей проработать весь этот месяц.

Конечно, фантастика, но для структуризации в программировании был придуман специальный язык (xml ). А для редактирования данных, представленных в этом формате, созданы специализированные xml редакторы:

Что такое XML

Многие знают, что основой любого веб-ресурса является HTML . С помощью языка гипертекста можно очень легко и удобно задавать иерархию всех элементов на веб-странице. Частично он позволяет решать проблему и стилевого оформления. Вся эта иерархия создается (структурируется ) с помощью встроенных тегов и их атрибутов, набор которых хоть и не малый, но все же ограниченный.

Поэтому HTML позволяет решать лишь одну единственную задачу структуризации в интернете: расстановки и создания элементов веб-страницы для ее последующей разметки (создания дизайна ). А как же структурировать остальные данные, передаваемые в бесчисленном количестве между ресурсами во всемирной паутине? Как без ограничений организовать их выборку, поиск и фильтрацию?

Все эти «недочеты » могут быть исправлены с помощью XML . Перед началом обзора редакторов xml давайте более подробно разберемся, что это за язык и какова область его применения в виртуальном пространстве:


Аббревиатура XML в переводе с английского означает «расширяемый язык разметки » (Xtensible Markup Language ). Он стандартизирован и рекомендован к использованию W3C . А это значит, что его применение является наиболее оптимальным и «беспроблемным » способом создания веб-документа.

Кроме описания документов XML также частично влияет на работу специальных системных программ. Препроцессоры этого языка предназначены для перевода данных с машинного кода в понятный для пользователя вид. Такие препроцессоры лежат в основе всех редакторов xml файлов.

Язык расширяемой разметки обладает следующими положительными сторонами:

  • Является идеальным средством для описания структуры и разметки любого веб-документа;
  • В XML нет ограниченного набора элементов, с помощью которых осуществляется структуризация. Вместо этого пользователь сам задает иерархию и имена всех элементов, опираясь лишь на правила описания языка;
  • XML обладает простым, понятным, а главное расширяемым синтаксисом;
  • Язык построен на основе основных кодировок Юникода;
  • Широко применяется не только для описания обычных веб-страниц, но и легко подключается к коду большинства языков программирования. В том числе и тех, которые используются в веб-программировании (PHP, ASP. NET и другие ).

Синтаксис XML

Каждый документ, написанный на XML , состоит из сущностей. Сущность – это самая маленькая единица (элемент ). Каждая из сущностей содержит в себе символы.

Они делятся на:

  • Символы разметки — теги, комментарии (< тег>, );
  • Буквенные символы – из них состоит основное содержимое, заключенное между тегами.

Логическая структура языка представляет собой иерархически вложенные друг в друга элементы. Самый верхний из них называется корневым. Любой из элементов включает в себя открывающийся и закрывающийся тег. И должен закрываться в том корневом для него элементе, в котором был открыт:

Hello, world!

Кроме корневого элемента XML документ состоит из пролога. Он расположен в самом начале кода. В состав пролога могут входить:

  • Объявления;
  • Инструкции обработки;
  • Комментарии.

Более наглядно основные составляющие XML показаны на следующем скриншоте документа, созданного в простом xml редакторе:


Более подробно с синтаксисом языка можно ознакомиться с помощью технической документации к XML .

Обзор редакторов для XML

  • Microsoft Visual Studio – представляет собой мощную среду разработки, объединившую в себя большое количество инструментов и средств для написания программного кода. В ее состав также входит «навороченный» редактор XML . Кроме всего прочего он поддерживает создание и визуализацию XML схем. К сожалению, в Visual Studio поддержка PHP реализована слабо. Эта среда больше «заточена » под создание веб-приложений с помощью ASP.NET :


  • Adobe Dreamweaver – еще одна мощная среда разработки. Весь ее инструментарий полностью направлен на создание сайтов. Поддерживается синтаксис нескольких языков программирования. В состав Dreamweaver также входит встроенный редактор xml таблиц:


  • XMLSpy XML Editor – мощное средство для работы с различными форматами данных XML. Поддерживается не только простое редактирование данных, схем, подсветка синтаксиса, но и графическая визуализация иерархических связей между элементами:


Визуальный xml редактор доступен в двух редакциях стоимостью 399 и 799 евро. Самый дорогой вариант включает в себя поддержку синтаксиса нескольких языков программирования и отладчик. Более дешевый вариант полностью совместим с наиболее популярными средами разработки (Visual Studio, Eclipse ), и может выступать в качестве их полноценной надстройки:


  • XML Notepad — бесплатный редактор xml . Имеет встроенную подсветку синтаксиса, средство валидации. А также поддержку построения схем. Приложение отличается простым и понятным интерфейсом:


Обзор онлайн-сервисов

  • XML Schema Generator – сервис позволяет из обычного документа XML создать схему (XSD ). Интерфейс сервиса отличается простотой и выполнен в черно-белых тонах. Кроме этого радует полное отсутствие рекламы;
  • xmlvalidation.com – данный ресурс позволяет произвести полную валидацию содержимого XML документа, скопированного в специальное поле или загруженного в виде файла:


  • XSL Transformation – служит для преобразования обычного XML кода с помощью указанных шаблонов стилей XSLT . Также в состав сервиса входит еще несколько десятков полезных для веб-мастера инструментов, в том числе и онлайн-валидатор XML .

Как видно из обзора, для работы с расширяемым языком разметки лучше всего применять обычный xml редактор, инсталлированный собственный компьютер или ноутбук. Набор инструментов специализированных онлайн-сервисов не так широк, и позволяет лишь проверить код XML документа на валидность. Или преобразовать его содержимое в схему.

Последнее обновление: 31.10.2015

Для работы с 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 создадим новый файл. Назовем его users.xml и определим в нем следующее содержание:

Microsoft 48 Google 42

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

Using System.Xml; class Program { static void Main(string args) { XmlDocument xDoc = new XmlDocument(); xDoc.Load("users.xml"); // получим корневой элемент XmlElement xRoot = xDoc.DocumentElement; // обход всех узлов в корневом элементе foreach(XmlNode xnode in xRoot) { // получаем атрибут name if(xnode.Attributes.Count>0) { XmlNode attr = xnode.Attributes.GetNamedItem("name"); if (attr!=null) Console.WriteLine(attr.Value); } // обходим все дочерние узлы элемента user foreach(XmlNode childnode in xnode.ChildNodes) { // если узел - company if(childnode.Name=="company") { Console.WriteLine("Компания: {0}", childnode.InnerText); } // если узел age if (childnode.Name == "age") { Console.WriteLine("Возраст: {0}", childnode.InnerText); } } Console.WriteLine(); } Console.Read(); } }

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

Чтобы начать работу с документом xml, нам надо создать объект XmlDocument и затем загрузить в него xml-файл: xDoc.Load("users.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")

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

List users = new List(); XmlDocument xDoc = new XmlDocument(); xDoc.Load("users.xml"); XmlElement xRoot = xDoc.DocumentElement; foreach(XmlElement xnode in xRoot) { User user = new User(); XmlNode attr = xnode.Attributes.GetNamedItem("name"); if (attr!=null) user.Name=attr.Value; foreach (XmlNode childnode in xnode.ChildNodes) { if (childnode.Name == "company") user.Company=childnode.InnerText; if (childnode.Name == "age") user.Age = Int32.Parse(childnode.InnerText); } users.Add(user); } foreach (User u in users) Console.WriteLine("{0} ({1}) - {2}", u.Name, u.Company, u.Age);

Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое.


XML DOM 2

В предыдущей статье были описаны общие понятия касающиеся XML. В этой статье научимся выполнять основные действия, связанные с изменением, добавлением, поиском в XML файле.

XML файл, который используется для примера.

Mazda 2007 BMW 2009

xml dom

В данный момент, наш файл содержит следующую структуру:

Взаимоотношение между узлами в XML DOM , основные моменты:

1. Любой узел в DOM дереве имеет родителя ParentNode . В нашем примере garage является родителем для обоих элементов car, а оба элемента car, являются в свою очередь родителями для элементов: model и year.

Как получить родителя для xml элемента car?

Console.WriteLine(elmRoot["car"].ParentNode.Name); //Результат: garage

2. У родителя могут быть дети ChildNodes. Например, для узла garage детьми являются оба элемента car. У элементов car, тоже есть дети model и year.

ChildNodes , представляет собой коллекцию, которая хранит все дочерние xml элементы, чтобы обратиться к нужному элементу, нужно указать его индекс. (Индекс всегда начинается с нуля!)

Например: как получить первый дочерний элемент?

ElmRoot.ChildNodes;

3. Как и в обычной жизни ребенок может родиться первым FirstChild, или последним LastChild.

Если взять для примера элемент car, то

FirstChild - это model LastChild - это year

4. В свою очередь между дочерними элементами тоже существуют связи, они могут быть братьями или сестрами, если проводить параллели с реальной жизнью.

У ребенка может быть к примеру брат Previous Sibling и следующий брат Next Sibling

Console.WriteLine(elmRoot.ChildNodes.FirstChild.NextSibling.Name); //Результат: year Console.WriteLine(elmRoot.ChildNodes. LastChild.PreviousSibling.Name); //Результат: model

Если элемент не найден, то тогда возникает исключение: NullReferenceException, поэтому при работе с xml всегда используйте блоки try catch.

Console.WriteLine(elmRoot.ChildNodes. LastChild.NextSibling.Name); Console.WriteLine(elmRoot.ChildNodes. FirstChild.PreviousSibling.Name);

LastChild является NextSibling;
FirstChild является PreviousSibling;

С помощью выше описанных методов можно легко переместиться к нужному узлу и получить любое нужное вам значение.

Как получить значение xml элемента?

Значение xml элемента можно получить при помощи свойства InnerText, например:

Console.WriteLine(elmRoot["car"].FirstChild.InnerText); //Результат: mazda

Ещё один способ, чтобы получить это же значение xml элемента:

Console.WriteLine(elmRoot.FirstChild.FirstChild.InnerText); //Результат: mazda

Последовательность перемещений по DOM дереву:

Garage -> car -> model -> Мазда

Получаем год:

ElmRoot["car"].LastChild.InnerText; //Результат: 2007

Последовательность:

Garage -> car -> year -> 2007

Ещё пример: 3 способа, для получения одного и того же результата.

Console.WriteLine(elmRoot.LastChild.FirstChild.InnerText); Console.WriteLine(elmRoot["car"].NextSibling.FirstChild.InnerText); Console.WriteLine(elmRoot.ChildNodes.Item(1).FirstChild.InnerText); //Результат: BMW

Если надо получить год для элемента со значением Mazda:

Console.WriteLine(elmRoot.FirstChild.LastChild.InnerText); //Результат: 2007

Для BMW (два способа, получить один и тот же результат)

Console.WriteLine(elmRoot.ChildNodes.Item(1). ChildNodes.Item(1).InnerText); Console.WriteLine(elmRoot.ChildNodes.ChildNodes.InnerText); //Результат: 2009

Как изменить значения xml элемента?

С помощью свойства InnerText() можно, как получить, так и изменить значение xml элемента, например изменим год.

//Устанавливаем новое значение elmRoot.FirstChild.LastChild.InnerText = "2010"; //Выводим новое значение на экран консоли Console.WriteLine(elmRoot.FirstChild.ChildNodes.Item(1).InnerText); //Результат: 2010

При этом нужно помнить, что все изменения происходят с виртуальным xml файлом, если Вы откроете физический файл, то увидите, что по-прежнему в нём указан год 2007.

Для того, чтобы изменения вступили в силу, нужно воспользоваться методом Save, например:

ElmRoot.Save("имя xml файла или поток");

Теперь информация будет изменена в «физическом» xml файле.

Как получить количество дочерних элементов?

Console.WriteLine(elmRoot.FirstChild.ChildNodes.Count);

garage -> car содержит 2 ребенка: model и year

Console.WriteLine(elmRoot.FirstChild.FirstChild.ChildNodes.Count);

garage -> car -> model содержит 1 дочерний xml элемент.

Обращение к дочерним элементам

по индексу

ElmRoot.ChildNodes.Name; elmRoot.ChildNodes.Name; //Результат: car

С помощью цикла

Foreach (XmlNode nod in elmRoot.ChildNodes) { Console.WriteLine(nod.Name); } //Результат: car, car

Как получить имя xml элемента?

elmRoot.Name; //Результат: garage

Создание нового XML элемента

Создадим новый элемент в нашем XML документе, чтобы он отличался от двух других (car) назовём его автобус (bus).

При создании нового элемента воспользуемся рекомендацией с сайта msdn и вместо стандартного new XmlElement воспользуемся методом CreateElement.

XmlElement elm = xmlDoc.CreateElement("bus");

Создание и добавление нового xml элемента

Создадим новый xml элемент по имени «BUS».

XmlElement elmRoot = xmlDoc.DocumentElement; Console.WriteLine(elmRoot.ChildNodes.Count); //car, car XmlElement elmNew = xmlDoc.CreateElement("bus"); elmRoot.AppendChild(elmNew); Console.WriteLine(elmRoot.ChildNodes.Count); //3 car, car, bus xmlDoc.Save("имя xml файла");

Пояснение:

1. Сначала получаем root-элемент к которому будем крепить новые элементы.

2. В качестве проверки выведем текущее количество дочерних элементов у элемента garage: 2 (car и car)

3. Создаем новый элемент BUS

4. При помощи метода AppendChild добавляем новый элемент в дерево

5. Снова воспользуемся проверкой и выведем текущее количество элементов у элемента garage, теперь их стало 3: car, car, bus.

6. Чтобы изменения затронули физический файл, сохраняемся

В самом XML файле новый элемент будет выглядеть так:

Как добавить новый xml элемент?

Задача: создать новый XML элемент и добавить в него какое-нибудь текстовое содержимое, например год выпуска.

String strFilename = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(strFilename); XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmNew = xmlDoc.CreateElement("bus"); XmlText new_txt = xmlDoc.CreateTextNode("2006"); elmRoot.AppendChild(elmNew); elmRoot.LastChild.AppendChild(new_txt); Console.WriteLine(elmRoot.ChildNodes.Name); //bus Console.WriteLine(elmRoot.ChildNodes.LastChild.InnerText); //2006 Console.Read();

В XML файле:

2006

Для наглядности

А теперь создадим узел «bus», с такой же архитектурой, как и car, то есть добавим узлы: model, year и какое-нибудь текстовое содержимое.

Создание XML элемента с дочерними элементами

string strFilename = @"C:\lessons\Auto.xml"; //создаем новый xml документ в памяти XmlDocument xmlDoc = new XmlDocument(); //загружаем xml файл в память xmlDoc.Load(strFilename); //Получаем root-элемент XmlElement elmRoot = xmlDoc.DocumentElement; //Создаём 3 элемента: bus, model, year XmlElement elmBUS = xmlDoc.CreateElement("bus"); XmlElement elmModel = xmlDoc.CreateElement("model"); XmlElement elmYear = xmlDoc.CreateElement("year"); //Устанавливаем значения для элементов: model, year XmlText year_txt = xmlDoc.CreateTextNode("2006"); //XmlText mod_txt = xmlDoc.CreateTextNode("liaz"); добавим иначе //К элементу bus добавляем два дочерних элемента: model и year elmBUS.AppendChild(elmModel); elmBUS.AppendChild(elmYear); //Добавляем значения узлам model и year elmModel.InnerText = "liaz"; elmYear.AppendChild(year_txt); //Добавляем в дерево новый xml элемент bus elmRoot.AppendChild(elmBUS); //Проверяем, всё ли добавлено, как надо Console.WriteLine(elmRoot.ChildNodes.FirstChild.InnerText); Console.WriteLine(elmRoot.LastChild.LastChild.InnerText); //Если всё в порядке, то используем метод Save xmlDoc.Save("имя xml файла");

Результат:

liaz 2006

Как можно сократить, данный код? Например, следующим образом:

String PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlElement elmRoot = xmlDoc.DocumentElement; XmlElement elmBUS = xmlDoc.CreateElement("bus"); XmlElement elmModel = xmlDoc.CreateElement("model"); XmlElement elmYear = xmlDoc.CreateElement("year"); //Добавляем значения узлам model и year elmModel.InnerText = "liaz"; elmYear.InnerText = "2006"; elmBUS.AppendChild(elmModel); elmBUS.AppendChild(elmYear); elmRoot.AppendChild(elmBUS); //Если всё верно, то вызываем метод Save xmlDoc.Save("имя xml файла");

Ещё немного сократим код, для этого воспользуемся свойством InnerXml:

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlElement elmXML = xmlDoc.CreateElement("bus"); string txt = "liaz" + "2006"; //InnerXml! elmXML.InnerXml = txt; //xmlDoc.DocumentElement (будет равен garage) - это ещё один способ обратиться к root-элементу, тоже самое что и XmlElement elmRoot = xmlDoc.DocumentElement; xmlDoc.DocumentElement.AppendChild(elmXML); xmlDoc.Save(PathXmlFile);

Результат

Получить список элементов при помощи GetElementByTagName

GetElementByTagName возвращает XmlNodeList , в котором содержаться все элементы потомки, принадлежащие указному элементу, например, нам нужно получить все модели машин, которые хранятся в гараже:

XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(strFilename); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); foreach (XmlNode node in modelName) { Console.WriteLine(node.InnerText); } //Результат: mazda, bmw, liaz

Обращение при помощи индекса:

String PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); Console.WriteLine(modelName.InnerText); //Результат: liaz

Как изменить текстовое содержимое, у только что созданного элемента «bus», при помощи метода GetElementByTagName?

String PathXmlFile = @"C:\lessons\Auto.xml"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(PathXmlFile); XmlNodeList modelName = xmlDoc.GetElementsByTagName("model"); Console.WriteLine(modelName.InnerText); //Получили значение: liaz

Либо можно изменить имя liaz на Ikarus

Console.WriteLine(modelName.InnerText = "Ikarus");

Похожие статьи