Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Обзор [ править ]

Язык XPath основан на древовидном представлении XML-документа и предоставляет возможность перемещаться по дереву, выбирая узлы по множеству критериев. [2] [3] В популярном использовании (хотя и не в официальной спецификации) выражение 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 по-прежнему является наиболее широко доступной версией. [4]

  • XPath 1.0 стал Рекомендацией 16 ноября 1999 г. и широко реализуется и используется либо сам по себе (вызывается через API из таких языков, как Java , C # , Python или JavaScript ), либо встроен в такие языки, как XSLT , XProc , XML Schema. или 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 ). Он предлагает forвыражение, которое является урезанной версией выражений " FLWOR " в XQuery. Можно описать язык, перечислив части XQuery, которые он не учитывает: основными примерами являются пролог запроса, конструкторы элементов и атрибутов, остаток синтаксиса «FLWOR» и typeswitchвыражение.
  • 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.

Расширенный синтаксис [ править ]

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

  • /child::A/child::B/child::C
  • child::A/descendant-or-self::node()/child::B/child::node()[position()=1]

Здесь, в каждом шаге XPath, то ось (например , childили descendant-or-self) явно указано, а затем , ::а затем тест узла , например, Aили node()в приведенных выше примерах.

Здесь то же самое, но покороче:

A//B/*[position()=1]

Спецификаторы осей [ править ]

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

  1. ^ Авторитетный XML Нормальный Уолш поддерживает отличную онлайн-визуализацию спецификаторов осей. [8] Из иллюстрации видно, что предыдущий , предок , сам , потомок и последующий образуют полный, упорядоченный, неперекрывающийся раздел дерева элементов документа.

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

Узловые тесты [ править ]

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

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

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

Предикаты [ править ]

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

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

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

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

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

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

Функции и операторы [ править ]

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

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

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

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

  • Функции для управления строками: concat (), substring (), contains (), substring-before (), substring-after (), translate (), normalize-space (), string-length ()
  • Функции для работы с числами: sum (), round (), floor (), потолок ()
  • Функции для получения свойств узлов: name (), local-name (), namespace-uri ()
  • Функции для получения информации о контексте обработки: position (), last ()
  • Функции преобразования типов: string (), number (), boolean ()

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

Функции набора узлов [ править ]

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

Строковые функции [ править ]

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

Логические функции [ править ]

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

Числовые функции [ править ]

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

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

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

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

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

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

Синтаксис и семантика (XPath 2.0) [ править ]

Синтаксис и семантика (XPath 3) [ править ]

Примеры [ править ]

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

<? xml version = "1.0" encoding = "utf-8"?> <Wikimedia>  <projects>  <project  name = "Wikipedia"  launch = "2001-01-05" >  <editions>  <edition  language = "English" > en.wikipedia.org </edition>  <edition  language = "German" > de.wikipedia.org </edition>  <edition  language = "French" > fr.wikipedia.org </edition>  <edition  language = "Польский " > пл.википедия.org </edition>  <edition  language = "Spanish" >es.wikipedia.org </edition>  </editions>  </project>  <project  name = "Wiktionary"  launch = "2002-12-12" >  <editions>  <edition  language = "English" > en.wiktionary.org </edition>  <edition  language = "French" > fr.wiktionary.org </edition>  <edition  language = "Vietnamese" > vi.wiktionary.org </edition>  <edition  language = "Turkish" > tr.wiktionary. org </ edition>  <edition  language = "Spanish" >es.wiktionary.org </edition>  </editions>  </project>  </projects> </Wikimedia>

Выражение XPath

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

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

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

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

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

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

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

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

Реализации [ править ]

Инструменты командной строки [ править ]

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

ОСНОВНОЙ [ править ]

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

C / C ++ [ править ]

  • libxml2
  • Патан
  • pugixml
  • База данных Sedna XML
  • VTD-XML
  • Ксалан
  • XQilla

Free Pascal [ править ]

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

Реализации для движков баз данных [ править ]

  • OpenLink Virtuoso

Java [ править ]

  • Saxon XSLT поддерживает XPath 1.0, XPath 2.0 и XPath 3.0 (а также XSLT 2.0, XQuery 3.0 и XPath 3.0)
  • BaseX (также поддерживает XPath 2.0 и XQuery)
  • VTD-XML
  • База данных Sedna XML Оба XML: DB и проприетарный.
  • QuiXPath - реализация потоковой передачи с открытым исходным кодом от Innovimax
  • Ксалан
  • Dom4j

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

JavaScript [ править ]

  • Плагин jQuery XPath на основе реализации XPath 2.0 с открытым исходным кодом в JavaScript
  • FontoXPath Реализация XPath 3.1 с открытым исходным кодом на JavaScript. В настоящее время в разработке.

.NET Framework [ править ]

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

Perl [ править ]

  • XML :: LibXML (libxml2)

PHP [ править ]

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

Python [ править ]

  • ElementTree XML API в стандартной библиотеке Python включает ограниченную поддержку для выражений XPath
  • libxml2
  • Амара
  • База данных Sedna XML
  • lxml
  • Scrapy [13]

Руби [ править ]

  • libxml2 [14]
  • Нокогири

Схема [ править ]

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

SQL [ править ]

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

Tcl [ править ]

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

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

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

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

См. Также [ править ]

  • XPath 3
  • Навигационная база данных
  • XLink
  • База данных XML
  • XSL
  • XSL-FO

Ссылки [ править ]

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

Внешние ссылки [ править ]

  • Спецификация XPath 1.0
  • Спецификация XPath 2.0
  • Спецификация XPath 3.0
  • Спецификация XPath 3.1
  • Что нового в XPath 2.0
  • Справочник по XPath (MSDN)
  • Синтаксис выражения XPath (саксонский)
  • Синтаксис выражений XPath 2.0 (саксонский) , [1]
  • XPath - документы MDC от сети разработчиков Mozilla
  • Введение / руководство по XPath
  • Справочник по функциям XSLT и XPath