Работа с данными в формате XML

Объектная модель документа XML

DOM (Document Object Model) является моделью преставления данных, построенной на базе структуры объектов. Все документы в DOM имеют древовидную логическую структуру. Вершиной дерева служит один корневой элемент, который может иметь несколько дочерних элеменов.

Если для некоторого документа использовать два DOM-представления, то они всегда создадут одну и нуже структурную модель.

Для определения структуры документа используется язык XML.

XML-документ состоит из дочерних и родительских узлов.

Начальный тег определяет корень документа. Вложенные теги определяют элементы документа. Элементом называется набор тегов и заключенные в нем данные. Теги могут содержать вместо данных другие теги. Открывающий тег может содержатьатрибуты.

XML-файл начинается с пролога, в котором может быть указан номер версии, кодировка, задано определение типа документа DTD (Document Type Defenition). Определение типа документа может быть расположено в самом файле или находиться в отдельном файле. Это указывается в строке пролога DOCTYPE.

Например:

<?xml version="1.0" encoding="UTF-8"

                            standalone="no" ?>

<!DOCTYPE myschema SYSTEM "xmldtd.dtd">

 

Определение типа документа описывает элементы, из которых состоит документ. Узел  !DOCTYPE реализуется классом XmlDocumentType.

Например:

<!DOCTYPE myschema [

      <!ELEMENT myschema(book)*>

      <!–Каждый элемент book состоит из элементов title, autor и price –>

      <!ELEMENT book (title, autor+, price)>

<!ELEMENT title (#PCDATA)>

<!ELEMENT autor (fname, lname)>

<!ELEMENT fname (#PCDATA)>

<!ELEMENT lname (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ATTLIST price type (DOLLAR|EURO|RUBL)

    #REQUIRED>

]>

 

Суффикс + определяет наличие дочерних элементов (больше или равно 1). Если число элементов равно 0 или 1, то используется суффикс ?, а если число элементов больше или равно 0, то суффикс *.

Параметр #PCDATA устанавливает, что текст данного элемента не может быть текстом разметки.

Если задать параметр #CDATA, то для этих данных не будет определяться их соответветствие определению типа документа.

После пролога располагается тело документа, состоящее из узлов, описывающих инструкции по обработке данных, содержимое, атрибуты, ссылки на объекты, комментарии, фрагменты документов.

Атрибуты могут быть пользовательские и встроеннве (определяемые спецификацией языка XML).

Ссылка на объект указывается его именем с префиксом &.

Комментарии указываются внутри тега  <!–   –>.

Доступ к XML-документам

Класс DOM XML представляет XML-документ в памяти, и позволяет читать и записывать документ.

Для доступа к XML-документу можно использовать функции Simple API for XML (SAX). При этом весь XML-документ не загружается в память, а выполняется синтаксический анализ документа, при котором инициируются соответствующие события.

В Framework .NET каждый отдельный узел, представляющий элемент, реализуется классом XmlElement. Сам документ реализуется классом XmlDocument.

Класс XmlDocument

Для загрузки XML-документа достаточно выполнить следующий код:

XmlDocument doc= new XmlDocument();

doc.Load("MyDataFile.xml");

Console.WrineLine(doc.InnerXml.ToString);

Для загрузки XML-документа можно использовать следующие методы;

§  Load("имя_xml_файла")

§  LoadXml("содержание_xml_документа").

 

Для сохранения XML-документа можно применятьметод Save("имя_файла") класса XmlDocument.

Каждый узел XML-документа представляется классом XmlNode. Для последовательного доступа ко всем дочерним узлам XML-документа следует использовать свойство ChildNodes класса XmlDocument.

Например:

private void button2_Click(object sender,

                          EventArgs e)

  {

  mydb1DataSet.Tbl1.WriteXml("MyDataFile.xml");

  XmlDocument doc = new XmlDocument();

   doc.Load("MyDataFile.xml");

   int i, count;

   count = 0; i = 1;

   XmlNode node = doc.ChildNodes[1];

   foreach (XmlNode node1 in node.ChildNodes)

    {

     Console.WriteLine("——-");

     // Отобразим все узлы дочерние к данному

    foreach (XmlNode node2 in node1.ChildNodes)

     {

   Console.WriteLine( doc.DocumentElement.FirstChild.ChildNodes[count].Name + "= " + node2.FirstChild.Value);

   count++;

 

       }

   i++; count = 0;

  }

}

Вывод строк XML-документа при последовательном чтении узлов документа.

 

Классы XmlReader и XmlWriter

Для реализации однонаправленного чтения XML-документа используются классы, наследуемые от  XmlReader:

§  XmlTextReader – позволяет читать XML-документы без их проверки;

§  XmlValidatingReader – позволяет читать XML-документы и предоставляет доступ к схеме документа.

Класс XmlTextReader может читать данные как из XML-файла, так и из потока.

Например:

XmlTextReader xml1=

           new XmlTextReader("MyDataFile.xml");

Для реализации записи XML-документа используются классы, наследуемые от  XmlWriter, например XmlTextWriter.

Например:

using System;

using System.IO;

using System.Xml;

 

 public class ReadWriteXML

{

  private const string doc = "MyDataFile.xml";

  public static void Main() {

   XmlWriter writer = null;

   try {

     writer = XmlWriter.Create (doc);

          

     writer.WriteComment("XML документ");

    

      // Запись корневого элемента

      writer.WriteStartElement("book");

 

      // Запись атрибута

      writer.WriteAttributeString("xmlns",

                                               null,

                                               "urn:ReadWriteXML");

   

        

      // Запись элемента title

      writer.WriteStartElement("title");

      writer.WriteString("Название 1");

        writer.WriteEndElement();

 

     // Запись элемента autor

     writer.WriteElementString ("autor",

                                "имя 1");

      // Запись элемента price.

      writer.WriteElementString("price",

                                 "135");

 

      // Закрываем тег для корневого элемента

      writer.WriteEndElement();

    // Запись XML-файла и закрытие потока

    // XML-данных

      writer.Flush();

      writer.Close();

   }

     finally {

       if (writer != null)  writer.Close();

     }

   }

 }

 

Метод WriteStartElement класса XmlTextWriter записывает открывающий тег задаваемого элемента, а метод WriteEndElement – записывает закрывающтй тег.

Метод WriteStartDocument записывает в начало документа строку <?xml version="1.0" ?>.

Метод WriteElementString записывет символьные данные элемента.

 

 

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100