XPath - XPath

XPath
ПарадигмаЯзык запроса
РазработчикW3C
Впервые появился1998
Стабильный выпуск
3.1 / 21 марта 2017 г.; 3 года назад (2017-03-21)
Под влиянием
XSLT, XPointer
Под влиянием
Схема XML, XForms

XPath (XML Path Language) это язык запросов для выбора узлы из XML документ. Кроме того, XPath можно использовать для вычисления значений (например, струны, числа или Булево values) из содержимого XML-документа. XPath был определен Консорциум World Wide Web (W3C).[1]. XPath можно легко написать и проверить на SelectorsHub.[2]

Обзор

Язык XPath основан на представление XML-документа в виде дерева, и предоставляет возможность перемещаться по дереву, выбирая узлы по множеству критериев.[3][4] В популярном использовании (хотя и не в официальной спецификации) выражение XPath часто называют просто «XPath».

Первоначально мотивировано желанием предоставить общий синтаксис и модель поведения между XPointer и XSLT, подмножества XPath язык запросов используются в других W3C спецификации, такие как Схема XML, XForms и Набор тегов интернационализации (ITS).

XPath был принят рядом библиотек и инструментов обработки XML, многие из которых также предлагают Селекторы CSS, еще один стандарт W3C, как более простая альтернатива XPath.

Версии

Используется несколько версий XPath. XPath 1.0 был опубликован в 1999 году, XPath 2.0 в 2007 году (со вторым выпуском в 2010 году), XPath 3.0 в 2014 году и XPath 3.1 в 2017 году. Однако XPath 1.0 по-прежнему является наиболее широко доступной версией.[1]

  • XPath 1.0 стал Рекомендацией 16 ноября 1999 г. и широко реализуется и используется либо сам по себе (вызывается через API из таких языков, как Ява, C #, Python или же JavaScript ) или встроены в такие языки, как XSLT, XProc, Схема XML или XForms.
  • XPath 2.0 стал Рекомендацией 23 января 2007 г., а второе издание было опубликовано 14 декабря 2010 г. Существует ряд реализаций, но они не так широко используются, как XPath 1.0. Спецификация языка XPath 2.0 намного больше, чем XPath 1.0, и меняет некоторые фундаментальные концепции языка, такие как система типов.
    Наиболее заметным изменением является то, что XPath 2.0 построен на основе Модель данных XQuery и XPath (XDM), который имеет гораздо более богатую систему типов.[5] Каждое значение теперь представляет собой последовательность (одно атомарное значение или узел рассматривается как последовательность длины один). Наборы узлов XPath 1.0 заменяются последовательностями узлов, которые могут быть в любом порядке.
    Для поддержки более богатых наборов типов XPath 2.0 предлагает значительно расширенный набор функций и операторов.
    XPath 2.0 на самом деле является подмножеством XQuery 1.0. У них одна и та же модель данных (XDM ). Он предлагает за выражение, которое является урезанной версией "FLWOR "выражений в XQuery. Можно описать язык, перечислив части XQuery, которые он не учитывает: основными примерами являются пролог запроса, конструкторы элементов и атрибутов, оставшаяся часть синтаксиса" FLWOR "и машинка выражение.
  • XPath 3.0 стал Рекомендацией 8 апреля 2014 г.[6] Наиболее важной новой функцией является поддержка функций как первоклассных значений. Дополнительные сведения о новых возможностях XPath 3.0 см. В разделе.[7] XPath 3.0 - это подмножество XQuery 3.0, и большинство последних реализаций (апрель 2014 г.) существуют как часть механизма XQuery 3.0.
  • XPath 3.1 стал Рекомендацией 21 марта 2017 г. В этой версии добавлены новые типы данных: карты и массивы, в основном для поддержки поддержки JSON.
Выражение XPath, примененное к XML-файлу

Синтаксис и семантика (XPath 1.0)

Самый важный вид выражения в XPath - это путь к местоположению. Путь местоположения состоит из последовательности шаги местоположения. Каждый шаг локации состоит из трех компонентов:

Выражение XPath оценивается относительно узел контекста. Спецификатор оси, такой как «дочерний» или «потомок», определяет направление перехода от контекстного узла. Проверка узла и предикат используются для фильтрации узлов, указанных спецификатором оси: Например, проверка узла «A» требует, чтобы все узлы, к которым осуществляется переход, имели метку «A». Предикат можно использовать, чтобы указать, что выбранные узлы имеют определенные свойства, которые задаются самими выражениями XPath.

Синтаксис XPath бывает двух видов: сокращенный синтаксис, более компактен и позволяет легко писать и читать XPath с использованием интуитивно понятных и, во многих случаях, знакомых символов и конструкций. В полный синтаксис является более подробным, но позволяет указать больше параметров и более информативным при внимательном чтении.

Сокращенный синтаксис

Компактное обозначение позволяет использовать множество значений по умолчанию и сокращений для общих случаев. Данный исходный XML содержит не менее

<A>  <B>    <C/>  </B></A>

простейший XPath принимает такую ​​форму, как

  • / A / B / C

который выбирает элементы C, которые являются дочерними элементами элементов B, которые являются дочерними по отношению к элементу A, который формирует самый внешний элемент документа XML. Синтаксис XPath предназначен для имитации URI (Единый идентификатор ресурса ) и Путь к файлу в стиле Unix синтаксис.

Более сложные выражения можно создать, указав ось, отличную от «дочерней» оси по умолчанию, проверку узла, отличную от простого имени, или предикаты, которые можно записать в квадратных скобках после любого шага. Например, выражение

  • A // B / * [1]

выбирает первого ребенка ('*[1]'), независимо от его имени, каждого элемента B, который сам является потомком или другим, более глубоким потомком ('//') элемента A, который является дочерним по отношению к текущему узлу контекста (выражение не начинается с символа'/'). Обратите внимание, что предикат [1] связывает крепче, чем / оператор. Чтобы выбрать первый узел, выбранный выражением A // B / *, записывать (A // B / *) [1]. Также обратите внимание, что значения индексов в предикатах XPath (технически «позиции близости» наборов узлов XPath) начинаются с 1, а не с 0, как это обычно бывает в таких языках, как C и Java.

Расширенный синтаксис

В полном, несокращенном синтаксисе два приведенных выше примера будут записаны

  • / ребенок :: A / ребенок :: B / ребенок :: C
  • child :: A / потомок-или-self :: node () / child :: B / child :: * [позиция () = 1]

Здесь на каждом шаге XPath ось (например. ребенок или же потомок или я) явно указано, за которым следует :: а затем тест узла, Такие как А или же узел() в примерах выше.

Спецификаторы оси

Спецификаторы оси указывают направление навигации в древовидном представлении XML-документа. Доступны следующие оси:

Спецификаторы осей в XPath
Полный синтаксисСокращенный синтаксисПримечания
предок
предок или я
атрибут@@abc это сокращение от attribute :: abc
ребенокxyz это сокращение от child :: xyz
потомок
потомок или я//// это сокращение от / потомок-или-сам :: узел () /
следующий
следующий брат
пространство имен
родитель.... это сокращение от родитель :: узел ()
предшествующий
предыдущий брат
себя.. это сокращение от self :: node ()

В качестве примера использования атрибут ось в сокращенном синтаксисе, // a / @ href выбирает атрибут с именем href в а элементы в любом месте дерева документа. . (сокращение от self :: node ()) чаще всего используется в предикате для ссылки на текущий выбранный узел. Например, h3 [. = 'См. также'] выбирает элемент с именем h3 в текущем контексте, текстовое содержание которого Смотрите также.

Узловые тесты

Тесты узлов могут состоять из конкретных имен узлов или более общих выражений. В случае XML-документа, в котором префикс пространства имен GS был определен, // gs: запрос найдет все расследование элементы в этом пространстве имен и // gs: * найдет все элементы, независимо от локального имени, в этом пространстве имен.

Другие форматы тестирования узлов:

комментарий()
находит узел комментария XML, например <!-- Comment -->
текст()
находит узел типа text, например то Привет, мир в <k>hello<m> world</m></k>
инструкция по обработке ()
находит XML инструкции по обработке Такие как <?php echo $a; ?>. В этом случае, инструкция по обработке ('php') будет соответствовать.
узел()
находит вообще любой узел.

Предикаты

Предикаты, записанные в виде выражений в квадратных скобках, могут использоваться для фильтр набор узлов в соответствии с некоторым условием. Например, а возвращает набор узлов (все а элементы, которые являются дочерними по отношению к контекстному узлу), и a [@ href = 'help.php'] сохраняет только те элементы, которые имеют href атрибут со значением help.php.

Нет ограничений на количество предикатов в шаге, и они не должны ограничиваться последним шагом в XPath. Они также могут быть вложены на любую глубину. Пути, указанные в предикатах, начинаются в контексте текущего шага (т. Е. Непосредственно предшествующего теста узла) и не изменяют этот контекст. Чтобы совпадение произошло, все предикаты должны быть выполнены.

Когда значение предиката числовое, это синтаксический сахар для сравнения с позицией узла в наборе узлов (как задано функцией позиция()). Так p [1] сокращение для p [позиция () = 1] и выбирает первый п дочерний элемент, а p [последний ()] сокращение для p [позиция () = последняя ()] и выбирает последний п дочерний элемент контекстного узла.

В других случаях значение предиката автоматически преобразуется в логическое значение. Когда предикат оценивается как набор узлов, результат будет истинным, когда набор узлов равен непустой[уточнить ]. Таким образом р [@x] выбирает те п элементы, имеющие атрибут с именем Икс.

Более сложный пример: выражение a [/ html / @ lang = 'ru'] [@ href = 'help.php'] [1] / @ target выбирает значение цель атрибут первого а среди дочерних элементов контекстного узла, имеющего свой href атрибут установлен на help.phpпри условии, что документ html элемент верхнего уровня также имеет язык атрибут установлен на en. Ссылка на атрибут элемента верхнего уровня в первом предикате не влияет ни на контекст других предикатов, ни на контекст самого шага местоположения.

Порядок предикатов имеет значение, если предикаты проверяют положение узла. Каждый предикат принимает набор узлов и возвращает (потенциально) меньший набор узлов. Так а [1] [@ href = 'help.php'] найдет совпадение, только если первый а дочерний элемент контекстного узла удовлетворяет условию @ href = 'help.php', в то время как a [@ href = 'help.php'] [1] найдет первый а ребенок, удовлетворяющий этому условию.

Функции и операторы

XPath 1.0 определяет четыре типа данных: наборы узлов (наборы узлов без внутреннего порядка), строки, числа и логические значения.

Доступные операторы:

  • Операторы «/», «//» и «[...]», используемые в выражениях пути, как описано выше.
  • Оператор объединения "|", который образует объединение двух наборов узлов.
  • Логические операторы "и" и "или", а также функция "not ()"
  • Арифметические операторы «+», «-», «*», «div» (деление) и «mod».
  • Операторы сравнения "=", "! =", "<", ">", "<=", "> ="

Библиотека функций включает:

  • Функции для управления строками: concat (), substring (), contains (), substring-before (), substring-after (), translate (), normalize-space (), длина строки ()
  • Функции для работы с числами: сумма (), круг (), пол (), потолок ()
  • Функции для получения свойств узлов: имя (), локальное имя (), пространство имен uri ()
  • Функции для получения информации о контексте обработки: позиция (), последняя ()
  • Функции преобразования типов: строка (), число (), логическое значение ()

Некоторые из наиболее часто используемых функций подробно описаны ниже.[8]

Функции набора узлов

позиция()
возвращает число, представляющее позицию этого узла в последовательности узлов, обрабатываемых в данный момент (например, узлы, выбранные инструкцией xsl: for-each в XSLT).
считать(набор узлов)
возвращает количество узлов в наборе узлов, указанном в качестве аргумента.

Строковые функции

нить(объект?)
преобразует любой из четырех типов данных XPath в строку в соответствии со встроенными правилами. Если значением аргумента является набор узлов, функция возвращает строковое значение первого узла в порядке документа, игнорируя любые последующие узлы.
concat (нить, нить, нить*)
соединяет две или более струны
начинается с(s1, s2)
возвращается истинный если s1 начинается с s2
содержит(s1, s2)
возвращается истинный если s1 содержит s2
подстрока (нить, Начните, длина?)
пример: подстрока ("ABCDEF"; 2,3) возвращается «БХД».
подстрока перед (s1, s2)
пример: подстрока перед ("1999/04/01", "/") возвращается 1999
подстрока после (s1, s2)
пример: подстрока-после ("1999/04/01", "/") возвращается 04/01
длина строки (строка?)
возвращает количество символов в строке
нормализовать-пространство (нить?)
все ведущие и конечные пробел удаляется, и любые последовательности пробельных символов заменяются одним пробелом. Это очень полезно, когда исходный XML мог быть Prettyprint отформатирован, что может сделать дальнейшую обработку строк ненадежной.

Логические функции

нет(логический)
отменяет любое логическое выражение.
истинный()
оценивает истинный.
ложный()
оценивает ложный.

Числовые функции

сумма (набор узлов)
преобразует строковые значения всех узлов, найденных аргументом XPath, в числа в соответствии со встроенными правилами приведения типов, а затем возвращает сумму этих чисел.

Примеры использования

Выражения могут быть созданы внутри предикатов с помощью операторов: =, !=, <=, <, >= и >. Логические выражения можно комбинировать с квадратными скобками. () и булевы операторы и и или же так же хорошо как нет() функция, описанная выше. В числовых вычислениях можно использовать *, +, -, div и мод. Строки могут состоять из любых Unicode символы.

// товар [@price> 2 * @ Discount] выбирает товары, для которых атрибут price более чем в два раза превышает числовое значение их атрибута скидки.

Целые наборы узлов могут быть объединены ('объединились' ) с помощью символа вертикальной черты |. Наборы узлов, которые удовлетворяют одному или нескольким из нескольких условий, можно найти, объединив условия внутри предиката с помощью 'или же'.

v [x или y] | w [z] вернет один набор узлов, состоящий из всех v элементы, которые имеют Икс или же у дочерние элементы, а также все ш элементы, которые имеют z дочерние элементы, найденные в текущем контексте.

Синтаксис и семантика (XPath 2.0)

Синтаксис и семантика (XPath 3)

Примеры

Учитывая образец XML-документа

<?xml version="1.0" encoding="utf-8"?><Wikimedia>  <projects>    <проект имя =«Википедия» запуск ="2001-01-05">      <editions>        <издание язык ="Английский">en.wikipedia.org</edition>        <издание язык ="Немецкий">de.wikipedia.org</edition>        <издание язык ="Французский">fr.wikipedia.org</edition>        <издание язык ="Польский">pl.wikipedia.org</edition>        <издание язык ="Испанский">es.wikipedia.org</edition>      </editions>    </project>    <проект имя =«Викисловарь» запуск ="2002-12-12">      <editions>        <издание язык ="Английский">en.wiktionary.org</edition>        <издание язык ="Французский">fr.wiktionary.org</edition>        <издание язык ="Вьетнамский">vi.wiktionary.org</edition>        <издание язык ="Турецкий">tr.wiktionary.org</edition>        <издание язык ="Испанский">es.wiktionary.org</edition>      </editions>    </project>  </projects></Wikimedia>

Выражение XPath

/ Викимедиа / проекты / проект / @ имя

выбирает атрибуты имени для всех проектов и

/ Викимедиа // редакции

выбирает все редакции всех проектов, и

/ Викимедиа / projects / project / editions / edition [@ language = 'English'] / text ()

выбирает адреса всех английских проектов Викимедиа (текст всех версия элементы, где язык атрибут равен английский). И следующие

/ Викимедиа / проекты / проект [@ name = 'Википедия'] / editions / edition / text ()

выбирает адреса всех Википедий (текст всех версия элементы, которые существуют под проект элемент с атрибутом имени Википедия).

Реализации

Инструменты командной строки

  • XMLStarlet простой в использовании инструмент для тестирования / выполнения команд XPath на лету.
  • xmllint (libxml2)
  • Сервер RaptorXML от Altova поддерживает XPath 1.0, 2.0 и 3.0
  • Сидель

БАЗОВЫЙ

  • XML-процессор Pavuk для QM / BASIC[9]

C / C ++

Free Pascal

  • Модуль XPath включен в библиотеки по умолчанию

Реализации для движков баз данных

Ява

В Ява упаковка javax.xml.xpath входит в стандартную версию Java со времен Java 5 [10] через Java API для обработки XML. Технически это XPath API вместо реализации XPath, и это дает программисту возможность выбрать конкретную реализацию, соответствующую интерфейсу.

JavaScript

.NET Framework

  • В пространствах имен System.Xml и System.Xml.XPath[11]
  • База данных Sedna XML

Perl

  • XML :: LibXML (libxml2)

PHP

  • База данных Sedna XML
  • DOMXPath через расширение libxml

Python

Рубин

Схема

  • База данных Sedna XML

SQL

  • MySQL поддерживает подмножество XPath начиная с версии 5.1.5[14]
  • PostgreSQL поддерживает XPath и XSLT, начиная с версии 8.4.[15]

Tcl

  • В пакет tdom предоставляет "очень полную, совместимую и быструю реализацию XPath на C"

Использование в языках схемы

XPath все чаще используется для выражения ограничений на языках схем для XML.

  • (Сейчас Стандарт ISO ) язык схемы Схематрон впервые применил подход.
  • Потоковое подмножество XPath используется в W3C XML Schema 1.0 для выражения уникальности и ключевых ограничений. В XSD 1.1 использование XPath расширено для поддержки условного присвоения типа на основе значений атрибутов и для оценки произвольных логических утверждений по содержимому элементов.
  • XForms использует XPath для привязки типов к значениям.
  • Этот подход нашел применение даже в приложениях, отличных от XML, таких как анализатор исходного кода для Java под названием PMD: Java преобразуется в ДОМ -подобно дереву синтаксического анализа, то правила XPath определяются для дерева.

Смотрите также

Рекомендации

  1. ^ а б «Хронология стандартов XML и семантической сети W3C» (PDF). 2012-02-04.
  2. ^ "умный редактор для XPath". 2020-07-29.
  3. ^ Бержерон, Рэнди (31 октября 2000 г.). «XPath - получение узлов из XML-документа». Журнал SQL Server. Архивировано из оригинал 26 июля 2010 г.. Получено 24 февраля, 2011.
  4. ^ Пьер Женев (Октябрь 2012 г.). «Курс: язык XPath» (PDF).
  5. ^ XPath 2.0 поддерживает атомарные типы, определенные как встроенные типы в Схема XML, а также может импортировать определяемые пользователем типы из схемы.
  6. ^ Рекомендация XPath 3.0 W3C
  7. ^ Что нового в версии 3.0 (XSLT / XPath / XQuery) (плюс XML Schema 1.1) Майкл Кей, Saxonica
  8. ^ Полное описание см. документ с рекомендациями W3C
  9. ^ Кроуэлл, Уильям (2016). "XML-процессор Pavuk" (PDF). www.pavuk.com.
  10. ^ https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/package-summary.html
  11. ^ System.Xml пространство имен
  12. ^ Герцог, Джастин (29 сентября 2016 г.). «Как сканировать веб-страницу с помощью Scrapy и Python 3». Цифровой океан. Архивировано из оригинал 4 октября 2017 г.. Получено 24 ноября 2017. Селекторы - это шаблоны, которые мы можем использовать для поиска одного или нескольких элементов на странице, чтобы затем мы могли работать с данными внутри элемента. scrapy поддерживает селекторы CSS или XPath.
  13. ^ http://xmlsoft.org/
  14. ^ http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html
  15. ^ Онлайн-документы на postgresql.org

внешняя ссылка