XPath представляет язык запросов в XML. Он позволяет выбирать элементы, соответствующие определенному селектору.
Рассмотрим некоторые наиболее распространенные селекторы:
.
выбор текущего узла
..
выбор родительского узла
*
выбор всех дочерних узлов текущего узла
user
выбор всех узлов с определенным именем, в данном случае с именем "user"
@name
выбор атрибута текущего узла, после знака @ указывается название атрибута (в данном случае "name")
@+
выбор всех атрибутов текущего узла
element[3]
выбор определенного дочернего узла по индексу, в данном случае третьего узла
//user
выбор в документе всех узлов с именем "user"
user[@name='Bill Gates']
выбор элементов с определенным значением атрибута. В данном случае выбираются все элементы "user" с атрибутом name='Bill Gates'
user[company='Microsoft']
выбор элементов с определенным значением вложенного элемента. В данном случае выбираются все элементы "user", у которых дочерний элемент "company" имеет значение 'Microsoft'
//user/company
выбор в документе всех узлов с именем "company", которые находятся в элементах "user"
Действие запросов XPath основано на применении двух методов класса
XmlElement:
SelectSingleNode(): выбор единственного узла из выборки. Если выборка по запросу содержит несколько узлов, то выбирается первый
SelectNodes(): выборка по запросу коллекции узлов в виде объекта XmlNodeList
Для запросов возьмем xml-документ:
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<company>Microsoft</company>
<age>48</age>
</user>
<user name="Larry Page">
<company>Google</company>
<age>42</age>
</user>
</users>
Теперь выберем все узлы корневого элемента, то есть все элементы user:
XmlDocument xDoc = new XmlDocument();
xDoc.Load("D://users.xml");
XmlElement xRoot = xDoc.DocumentElement;
// выбор всех дочерних узлов
XmlNodeList childnodes = xRoot.SelectNodes("*");
foreach (XmlNode n in childnodes)
Console.WriteLine(n.OuterXml);
Выберем все узлы <user>:
XmlNodeList childnodes = xRoot.SelectNodes("user");
Выведем на консоль значения атрибутов name у элементов user:
XmlNodeList childnodes = xRoot.SelectNodes("user");
foreach (XmlNode n in childnodes)
Console.WriteLine(n.SelectSingleNode("@name").Value);
Результатом выполнения будет следующий вывод:
Выберем узел, у которого атрибут name имеет значение "Bill Gates":
XmlNode childnode = xRoot.SelectSingleNode("user[@name='Bill Gates']");
if (childnode != null)
Console.WriteLine(childnode.OuterXml);
Выберем узел, у которого вложенный элемент "company" имеет значение "Microsoft":
XmlNode childnode = xRoot.SelectSingleNode("user[company='Microsoft']");
if (childnode != null)
Console.WriteLine(childnode.OuterXml);
Допустим, нам надо получить только компании. Для этого надо осуществить выборку вниз по иерархии элементов:
XmlNodeList childnodes = xRoot.SelectNodes("//user/company");
foreach (XmlNode n in childnodes)
Console.WriteLine(n.InnerText);