Синтаксис XPath

Для выбора узлов и наборов узлов в XML документе XPath использует выражения путей. Узел выбирается следуя по заданному пути или по, так называемым, шагам.

Пример XML документа

Для демонстрации синтаксиса XPath будет использоваться следующий XML документ:


<?xml version="1.0" encoding="UTF-8"?>
<messages>
   <note>
      <heading  date="10/01/2008">Напоминание</heading>
      <body>Отправить письмо!</body>
   </note>
   <note>
      <heading  date="11/01/2008">Re: Напоминание</heading>
      <body>Письмо отправлено</body>
   </note>
</messages>

Выбор узлов

Чтобы выбрать узлы в XML документе, XPath использует выражения пути. Узел выбирается следуя по заданному пути. Наиболее полезные выражения пути:

ВыражениеРезультат
имя_узлаВыбирает все узлы с именем "имя_узла"
/Выбирает от корневого узла
//Выбирает узлы от текущего узла, соответствующего выбору, независимо от их местонахождения
.Выбирает текущий узел
..Выбирает родителя текущего узла
@Выбирает атрибуты

В следующей таблице приводятся некоторые выражения XPath, позволяющие сделать некоторые выборки по демонстрационному XML документу:

Выражение XPathРезультат
messagesВыбирает все узлы с именем "messages"
/messagesВыбирает корневой элемент сообщений
Примечание: Если путь начинается с косой черты ( / ), то он всегда представляет абсолютный путь к элементу!
messages/noteВыбирает все элементы note, являющиеся потомками элемента messages
//noteВыбирает все элементы note независимо от того, где в документе они находятся
messages//noteВыбирает все элементы note, являющиеся потомками элемента messages независимо от того, где они находятся от элемента messages
//@dateВыбирает все атрибуты с именем date

Предикаты

Предикаты позволяют найти конкретный узел или узел с конкретным значением.

Предикаты всегда заключаются в квадратные скобки.

В следующей таблице приводятся некоторые выражения XPath с предикатами, позволяющие сделать выборки по демонстрационному XML документу:

Выражение XPathРезультат
/messages/note[1]Выбирает первый элемент note, который является прямым потомком элемента messages.
Примечание: В IE 5,6,7,8,9 первым узлом будет [0], однако согласно W3C это должен быть [1]. Чтобы решить эту проблему в IE, нужно установить опцию SelectionLanguage в значение XPath.
В JavaScript: xml.setProperty("SelectionLanguage","XPath");
/messages/note[last()]Выбирает последний элемент note, который является прямым потомком элемента messages.
/messages/note[last()-1]Выбирает предпоследний элемент note, который является прямым потомком элемента messages.
/messages/note[position()<3] Выбирает первые два элемента note, которые являются прямыми потомками элемента messages.
//heading[@date]Выбирает все элементы heading, у которых есть атрибут date
//heading[@date="10/01/2008"]Выбирает все элементы heading, у которых есть атрибут date со значением "10/01/2008"

Выбор неизвестных заранее узлов

Чтобы найти неизвестные заранее узлы XML документа, XPath позволяет использовать специальные символы.

СпецсимволОписание
*Соответствует любому узлу элемента
@*Соответствует любому узлу атрибута
node()Соответствует любому узлу любого типа

В следующей таблице приводятся некоторые выражения XPath со спецсимволами, позволяющие сделать выборки по демонстрационному XML документу:

Выражение XPathРезультат
/messages/*Выбирает все элементы, которые являются прямыми потомками элемента messages
//*Выбирает все элементы в документе
//heading[@*]Выбирает все элементы heading, у которых есть по крайней мере один атрибут любого типа

Выбор нескольких путей

Использование оператора | в выражении XPath позволяет делать выбор по нескольким путям.

В следующей таблице приводятся некоторые выражения XPath, позволяющие сделать выборки по демонстрационному XML документу:

Выражение XPathРезультат
//note/heading | //note/bodyВыбирает все элементы heading И body из всех элементов note
//heading | //bodyВыбирает все элементы heading И body во всем документе