Создание XML с помощью LINQ to XML в .NET

XML формат давно занял свою нишу среди технологий, которые используют разработчики. Данный формат достаточно удобен для хранения и передачи данных в приложениях. До LINQ to XML для работы с XML использовалась XML Document Object Model (DOM) API. Код получался достаточно большой и плохо читаемый.

Для примера возьмём вот такой XML:

   1: <contacts>

   2:     <contact id="523063B0-47C0-4ABE-8D38-4A449137A00B">

   3:         <name>Иван</name>

   4:         <surname>Иванов</surname>

   5:         <phone>(495)1234567</phone>

   6:     </contact>

   7:     <contact id="D939743F-BFF7-41E4-9A1B-1193EEFF0486">

   8:         <name>Олег</name>

   9:         <surname>Петров</surname>

  10:         <phone>(495)1234568</phone>

  11:     </contact>

  12: </contacts>

Для создания это XML на XML DOM нам понадобиться подключить пространство имён:

   1: using System.Xml;

и следующий код:

   1: string xmlpath = @"D:doc.xml";

   2:  

   3: XmlDocument doc = new XmlDocument();

   4:  

   5: XmlElement contacts = doc.CreateElement("contacts");

   6:  

   7: XmlElement contact1 = doc.CreateElement("contact");

   8: contact1.SetAttribute("id", "523063B0-47C0-4ABE-8D38-4A449137A00B");

   9: XmlElement name1 = doc.CreateElement("name");

  10: name1.InnerText = "Иван";

  11: contact1.AppendChild(name1);

  12: XmlElement surname1 = doc.CreateElement("name");

  13: surname1.InnerText = "Иванов";

  14: contact1.AppendChild(surname1);

  15: XmlElement phone1 = doc.CreateElement("phone");

  16: phone1.InnerText = "(495)1234567";

  17: contact1.AppendChild(phone1);

  18:  

  19: XmlElement contact2 = doc.CreateElement("contact");

  20: contact1.SetAttribute("id", "D939743F-BFF7-41E4-9A1B-1193EEFF0486");

  21: XmlElement name2 = doc.CreateElement("name");

  22: name2.InnerText = "Олег";

  23: contact2.AppendChild(name2);

  24: XmlElement surname2 = doc.CreateElement("name");

  25: surname2.InnerText = "Петров";

  26: contact2.AppendChild(surname2);

  27: XmlElement phone2 = doc.CreateElement("phone");

  28: phone2.InnerText = "(495)1234568";

  29: contact2.AppendChild(phone2);

  30:  

  31: contacts.AppendChild(contact1);

  32: contacts.AppendChild(contact2);

  33:  

  34: doc.AppendChild(contacts);

  35:  

  36: doc.Save(xmlpath);

Выглядит очень нагромождено и не с первого взгляда видна структура…

Для облегчения жизни разработчикам Microsoft представила технологию LINQ to XML (про сравнение MS XML DOM и LINQ to XML можно прочитать тут). Приведу код LINQ to XML, который создаёт приведённый выше XML файл, подключив сперва пространство имён:

   1: using System.Xml.Linq;

   1: string xmlpath = @"D:doc.xml";

   2:  

   3: XElement contact1 = new XElement("contact",

   4:     new XAttribute("id", "523063B0-47C0-4ABE-8D38-4A449137A00B"),

   5:     new XElement("name", "Иван"),

   6:     new XElement("surname", "Иванов"),

   7:     new XElement("phone", "(495)1234567"));

   8:  

   9: XElement contact2 = new XElement("contact",

  10:     new XAttribute("id", "D939743F-BFF7-41E4-9A1B-1193EEFF0486"),

  11:     new XElement("name", "Олег"),

  12:     new XElement("surname", "Петров"),

  13:     new XElement("phone", "(495)1234568"));

  14:  

  15: XElement contacts = new XElement("contacts",

  16:     contact1,

  17:     contact2);

  18:  

  19: XDocument doc = new XDocument(contacts);

  20:  

  21: doc.Save(xmlpath);

Как можно заметить – код гораздо легче читается, что обеспечивает более лёгкую поддержку в будущем.

Немного информации про объектную модель LINQ to XML

Объектную модель LINQ to XML можно увидеть на рисунке:

linq_to_xml_object_model

Классы XObject, XNode и XContainer – являются абстрактными, так что создавать мы их не можем. Класс XAttribute – не наследуется от XNode, т.е. не является узлом, это простой элемент коллекции, который представляет пару «ключ-значение». Классы XDocument и XElement – единственные, которые могут содержать узлы, унаследованные от XNode.

Важной особенностью LINQ to XML является тот момент, что нет необходимости создавать XDocument для того чтобы создать дерево XML или его фрагмент. Сам по себе XDocument не имеет ничего полезного, только возможность добавить к документу объявление (XDeclaration), создание типа (XDocumentType) либо инструкции обработки (XProcessingInstruction).

Посмотреть список информацию о классе XDocument можно тут. Про XDeclarationтут.

Немного примеров на последок

XAttribute

Создать можно двумя способами:

   1: XAttribute attribute = new XAttribute("Id", Guid.NewGuid());

   2: XElement element = new XElement("contact");

   3: element.Add(attribute);

или

   1: XElement element = new XElement("contact",

   2:   new XAttribute("Id", Guid.NewGuid()));

Результат в обоих случаях будет такой:

   1: <contact Id="523063B0-47C0-4ABE-8D38-4A449137A00B" />

XComment

Как не сложно догадаться – создаёт комментарий.

   1: XElement contacts = new XElement("conacts",

   2:   new XComment("All contacts"));

В результате увидим комментарий:

   1: <contacts>

   2:     <!-- All contacts -->

   3: </contacts>

XElement

Создать элемент можно так:

   1: XElement name = new XElement("name","Иван");

либо можно создать элемент, а потом передать значение:

   1: XElement name = new XElement("name");

   2: name.Value = "Иван";

Выводы

Технология LINQ to XML – удобное средство для разработки приложений, использующих xml. Код получается более понятным и легким в поддержке.

по материалам msdn, habrahabr.ru

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