Опубликован: 24.05.2010 | Уровень: специалист | Доступ: платный
Лекция 11:

Работа с XML в клиентской веб-разработке

< Лекция 10 || Лекция 11: 12 || Лекция 12 >

Создание XmlDocument "с нуля"

Чтобы создать XmlDocument, следует создать объект XmlDocument. Объект XmlDocument поддерживает методы CreateElement и CreateAttribute, используемые для добавления узлов в объект XmlDocument. Объект XmlElement содержит свойство Attributes, в которое входит набор XmlAttributeCollection. Класс XmlAttributeCollection происходит от класса XmlNamedNodeMap, представляющего собой набор пар "имя—значение".

protected void Button1_Click(object sender, EventArgs e) {
  //Объявить и создать XmlDocument XmlDocument xmlDoc = new XmlDocumentО;
  XmlElement el;
  int childCounter;
  int grandChildCounter;
  //Создать описание xml xmlDoc.AppendChild(
  xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null));

  //Создать корневой узел и добавить его в документ 
  el = xmlDoc.CreateElementC'myRoot"); 
  xmlDoc.AppendChild(el);

  //Цикл для обработки дочерних узлов
  for (childCounter = 1; childCounter <= 4; childCounter++) {
   XmlElement childelmt; XmlAttribute childattr;
   //Создать дочерний узел с атрибутом ID 
   childelmt = xmlDoc.CreateElement("myChild"); 
   childattr = xmlDoc.CreateAttribute("ID"); 
   childattr. Value = childCounter. ToStringO; 
   childelmt.Att ributes.Append(childatt r);
   //Добавить элемент в корневой элемент el.AppendChild(childelmt);
   for (grandChildCounter = 1; grandChildCounter <= 3; grandChildCounter++) {
    //Создать "внучатый" узел
    childelmt.AppendChild(xmlDoc.CreateElement("Grandchild"));
   }
 }
 //Сохранить в файл
 xmlDoc.Save(MapPath("XmlDocumentTest.xml"));
 Label lbl = GetLabel(275, 20);
 lbl.Text = "XmlDocumentTest.xml Created";
}

Сначала создается экземпляр класса XmlDocument. Далее описание XML создается и помещается в набор дочерних узлов. Если этот узел окажется не первым дочерним узлом XmlDocument, будет сгенерировано исключение. Ниже приводится XML-файл, сгенерированный при выполнении показанного выше кода:

<?xml version="1.О" encoding="utf-8" ?> 
<myRoot> 
  <myChild ID="1"> 
    <GrandChild /> 
    <GrandChild /> 
    <GrandChild /> 
  </myChild>
  <myChild ID="2">
    <GrandChild />
    <GrandChild />
    <GrandChild /> 
  </myChild> 
  <myChild ID="3 ">
    <GrandChild />
    <GrandChild />
    <GrandChild /> 
  </myChild> 
  <myChild ID=*'4">
    <GrandChild />
    <GrandChild />
    <GrandChild /> 
  </nyCnild> 
</myRoot>

Код, представленный выше, подходит и для объекта XmlDataDocument, но объект XmlDataDocument имеет больше возможностей для работы с реляционными данными.

Чтение и запись XML документов средствами ASP.NET 3.0

Пространство имен XML

Чтобы получить доступ к классам XML, достаточно добавить using System.Xml.

Пространство имен System.Xml дополняется также файлом System.Data.dll, где размещен класс XmlDataDocument. Если для работы требуется указанный класс, следует установить ссылку на файл System.Data.dll.

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

Класс XmlReaderабстрактный класс, который предоставляет однопроходный доступ к XML-данным, только для чтения и без кэширования. Он согласуется с рекомендациями XML 1.0 консорциума W3C и рекомендациями пространства имен в XML.

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

Класс XmlReader позволяет следующее.

  1. Проверить, что все символы являются допустимыми XML-символами, и что имена элементов и атрибутов являются допустимыми именами XML.
  2. Проверить, что XML-документ правильного формата.
  3. Проверить данные на соответствие DTD или схеме.
  4. Получить данные из потока XML или пропустить ненужные записи, используя модель Pull.
StringBuilder output = new StringBuilder();

String xmlString =
    @"<bookstore>
        <book genre='роман'>
          <title>Сто лет одиночества</title>
          <author>
            <first-name>Габриэль</first-name>
            <last-name>Маркес</last-name>
          </author>
          <price>120rur</price>
        </book>
    </bookstore>";

// Создание  XmlReader
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
  reader.ReadToFollowing("book");
  reader.MoveToFirstAttribute();
  string genre = reader.Value;
  output.AppendLine("The genre value: " + genre);

  reader.ReadToFollowing("title");
  output.AppendLine("Content of the title element: " + 
                    reader.ReadElementContentAsString());
}

Label1.Text = output.ToString();

В результате, в качестве текста элемента управления Label1 получим следующее:

The genre value: роман Content of the title element: Сто лет одиночества

Запись XML с помощью класса XmlWriter

Класс XmlWriter записывает XML-данные в поток, файл, TextReader или строку.

Класс XmlWriter записывает XML-данные в поток, файл, TextReader или строку. Предоставляет средства для создания XML-данных правильного формата однопроходным способом с возможностью только для записи без кэширования. Класс XmlWriter поддерживает рекомендации W3C XML 1.0 и пространств имен в XML. В этом разделе рассматривается создание экземпляра XmlWriter с указанным набором функций, проверкой соответствия данных, записи типизированных данных и т. д.

string xmlFile = Request.PhysicalApplicationPath + @"App_Data\BookStore.xml";
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.ConformanceLevel = ConformanceLevel.Auto;
settings.OmitXmlDeclaration = false;
using (XmlWriter writer = XmlWriter.Create(xmlFile, settings))
{
  writer.WriteStartDocument(false);
  writer.WriteComment("Комментарий.");
  writer.WriteStartElement("books");
  writer.WriteStartElement("book");
  writer.WriteElementString("id","1");
  writer.WriteElementString("name", "Сто лет одиночества");
  writer.WriteElementString("author", "Габриэль Гарсиа Маркес");
  writer.WriteElementString("price","120rur");
  writer.WriteEndElement();
  writer.WriteEndElement();
  writer.Flush();
}

Записанный Xml файл:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
  <!-- Комментарий -->
  <books>
    <book>
      <id> 1 </id>
      <name> Сто лет одиночества </name>
      <author> Габриэль Гарсиа Маркес </author>
      <price> 120rur </price>
    </book>
  </books>

Дополнительные источники

  1. http://www.interface.ru/home.asp?artId=5830
  2. http://www.beansoftware.com/ASP.NET-Tutorials/Using-XML.aspx
  3. http://www.aspnetmania.com/Articles/Article/59.html
  4. http://www.w3schools.com/aspnet/aspnet_xml.asp
  5. http://msdn.microsoft.com/ru-ru/library/9d83k261.aspx
  6. http://msdn.microsoft.com/ru-ru/library/tx3wa6ka.aspx
< Лекция 10 || Лекция 11: 12 || Лекция 12 >
Екатерина Соколова
Екатерина Соколова
Россия, Ухта
Никита Гекторов
Никита Гекторов
Украина, Донецк