воскресенье, 7 февраля 2010 г.

LINQ2XML

Одна из самых простых возможностей работы с XML в .NET – работа с использованием LINQ. Попробую описать в этом посте некоторые базовые элементы.

Для работы с XML через LINQ необходимо подключить пространство имен System.Xml.Linq.

Одним из базовых классов для работы с XML является класс XDocument. Одним из основных членов этого класса является метод Load(), который загружает xml-документ в память (также можно использовать метод Parse(), которому можно передать строку, содержащую xml, а не ссылку на документ, как методу Load()).

(Все примеры приводятся для RSS-потока подкаста от студентов-партнеров Microsoft - http://halftonine.rpod.ru/)

XDocument xdoc = XDocument.Load("http://halftonine.rpod.ru/rss.xml");

* This source code was highlighted with Source Code Highlighter.

Код

Console.WriteLine(xdoc.Root.Name.ToString());

* This source code was highlighted with Source Code Highlighter.

Выведет на экран имя корневого элемента (в нашем случае “rss”).

Чтение элементов.

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

var query = from data in xdoc.Descendants("item")
select new
{
Name = data.Element("title").Value,
Link = data.Element("link").Value,
PubDate = data.Element("pubDate").Value,
Description = data.Element("description").Value
};

* This source code was highlighted with Source Code Highlighter.

Но вы должны помнить, что код Linq выполняется «лениво», т.е. пока данные не понадобятся вышеуказанный код не будет выполнен. Давайте отобразим результаты на экране:

foreach (var item in query)
{
Console.WriteLine("---------------------------------------");
Console.WriteLine("Issue's name: " + item.Name.ToString());
Console.WriteLine("Issue's link: " + item.Link.ToString());
Console.WriteLine("Issue's publication date: " + item.PubDate.ToString());
}

* This source code was highlighted with Source Code Highlighter.

Очень часто нам нужно прочичать атрибут у xml-тега. Например ссылку на картинку у выпуска:

XNamespace itunes = "http://www.itunes.com/DTDs/Podcast-1.0.dtd";
var image = from data in xdoc.Descendants(itunes+"image")
select data;
foreach (var item in image)
{
Console.WriteLine("--------------------------------");
Console.WriteLine("Image link: " + item.Attribute("href").Value.ToString());
}

* This source code was highlighted with Source Code Highlighter.

Тут мы используем XNamespace, потому что исходный тег имеет вид: itunes:image, где itunes – пространство имен.

Запись элементов.

Основным классом для работы с элементами кода является XElement. Вот так с его помощью можно добавлять элементы:

XElement newElement = new XElement("newItem");
xdoc.Element("rss").Add(newElement);

* This source code was highlighted with Source Code Highlighter.

Добавление с дочерними элементами:

XElement embElement = new XElement("emdItem",
new XElement("smt1"),
new XElement("smt2"),
new XElement("smt3"));
xdoc.Element("rss").Element("newItem").Add(embElement);

* This source code was highlighted with Source Code Highlighter.

Аттрибуты.

Для добавления атрибутов служит класс XAttribute:

XElement attrElement = new XElement("attItem", new XAttribute("mark","5"));
xdoc.Element("rss").Element("newItem").Add(attrElement);

* This source code was highlighted with Source Code Highlighter.

Удаление элемента:

var remElements = from data in xdoc.Descendants("newItem")
select data;
remElements.Remove();

* This source code was highlighted with Source Code Highlighter.

Примеры тут.