XPath
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Парадигма | Язык запросов |
---|---|
Разработчик | W3C |
Впервые появился | 1998 |
Стабильная версия | 3.1
/ 21 марта 2017 г |
Под влиянием | |
XSLT , XPointer | |
Под влиянием | |
XML-схема , XForms , JSONPath |
XPath ( язык XML Path ) — это язык выражений, предназначенный для поддержки запросов или преобразования XML- документов. Он был определен Консорциумом Всемирной паутины (W3C) в 1999 году. [1] и может использоваться для вычисления значений (например, строк , чисел или логических значений ) из содержимого XML-документа. Поддержка XPath существует в приложениях, поддерживающих XML, таких как веб-браузеры, и во многих языках программирования.
Обзор
[ редактировать ]Язык XPath основан на древовидном представлении XML-документа и предоставляет возможность навигации по дереву, выбирая узлы по множеству критериев. [2] [3] В популярном использовании (хотя и не в официальной спецификации) выражение XPath часто называют просто «XPath».
Первоначально мотивированные желанием обеспечить общий синтаксис и модель поведения между XPointer и XSLT , подмножества языка запросов XPath используются в других спецификациях W3C, таких как XML Schema , XForms и набор тегов интернационализации (ITS) .
XPath был принят рядом библиотек и инструментов обработки XML, многие из которых также предлагают CSS Selectors , еще один стандарт 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 из таких языков, как 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), которая имеет гораздо более богатую систему типов. [а] Каждое значение теперь является последовательностью (отдельное атомарное значение или узел рассматривается как последовательность длины один). Наборы узлов XPath 1.0 заменяются последовательностями узлов, которые могут располагаться в любом порядке.
- Для поддержки более богатых наборов типов XPath 2.0 предлагает значительно расширенный набор функций и операторов.
- XPath 2.0 фактически является подмножеством XQuery 1.0. Они используют одну и ту же модель данных ( XDM ). Он предлагает
for
выражение, которое является урезанной версией выражений " FLWOR " в XQuery. Язык можно описать, перечислив части XQuery, которые он не учитывает: основными примерами являются пролог запроса, конструкторы элементов и атрибутов, остальная часть синтаксиса «FLWOR» иtypeswitch
выражение.
- XPath 3.0 стал Рекомендацией 8 апреля 2014 года. [4] Наиболее важной новой функцией является поддержка функций как значений первого класса. [5] XPath 3.0 — это подмножество XQuery 3.0, и большинство последних реализаций (апрель 2014 г.) существуют как часть механизма XQuery 3.0.
- XPath 3.1 стал Рекомендацией 21 марта 2017 года. [6] В этой версии добавлены новые типы данных: карты и массивы, в основном для поддержки JSON .
Синтаксис и семантика (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-документа. Доступные оси: [б]
Полный синтаксис | Сокращенный синтаксис | Примечания |
---|---|---|
ancestor |
||
ancestor-or-self |
||
attribute
|
@
|
@abc это сокращение от attribute::abc
|
child |
xyz это сокращение от child::xyz
| |
descendant
|
//
|
// это сокращение от /descendant-or-self::node()/
|
descendant-or-self |
||
following |
||
following-sibling |
||
namespace |
||
parent
|
..
|
.. это сокращение от parent::node()
|
preceding |
||
preceding-sibling |
||
self
|
.
|
. это сокращение от self::node()
|
В качестве примера использования оси атрибутов в сокращенном синтаксисе: //a/@href
выбирает атрибут с именем href
в a
элементы в любом месте дерева документа.
Выражение . (аббревиатура self::node() ) чаще всего используется внутри предиката для ссылки на текущий выбранный узел.
Например, h3[.='See also']
выбирает элемент с именем h3
в текущем контексте, текстовое содержимое которого See also
.
Тесты узлов
[ редактировать ]Тесты узлов могут состоять из конкретных имен узлов или более общих выражений. В случае XML-документа, в котором префикс пространства имен gs
было определено, //gs:enquiry
найду все enquiry
элементы в этом пространстве имен и //gs:*
найдет все элементы, независимо от локального имени, в этом пространстве имен.
Другие форматы тестирования узлов:
- комментарий()
- находит узел комментария XML, например
<!-- Comment -->
- текст()
- находит узел текстового типа, исключая дочерние элементы, например
hello
в<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 определяет четыре типа данных: наборы узлов (наборы узлов без внутреннего порядка), строки, числа и логические значения.
Доступные операторы:
- The
/
,//
и[...]
операторы, используемые в выражениях пути, как описано выше. - Оператор объединения,
|
, который образует объединение двух наборов узлов. - Булевы операторы
and
иor
и функцияnot()
- Арифметические операторы
+
,-
,*
,div
(разделить) иmod
- Операторы сравнения
=
,!=
,<
,>
,<=
,>=
Библиотека функций включает в себя:
- Функции для работы со строками: concat(), подстрока(), содержит(), подстрока-до(), подстрока-после(), перевод(), нормализовать-пространство(), длина строки()
- Функции для работы с числами: сумма(), раунд(), пол(), потолок()
- Функции для получения свойств узлов: имя(), локальное имя(), пространство имен-uri()
- Функции для получения информации о контексте обработки: позиция(), последняя()
- Функции преобразования типов: строка(), число(), логическое значение()
Некоторые из наиболее часто полезных функций подробно описаны ниже. [с]
Функции набора узлов
[ редактировать ]- позиция()
- возвращает число, представляющее позицию этого узла в последовательности узлов, обрабатываемых в данный момент (например, узлы, выбранные с помощью инструкции xsl:for-each в XSLT).
- count( набор узлов )
- возвращает количество узлов в наборе узлов, указанном в качестве аргумента.
Строковые функции
[ редактировать ]- строка ( объект ?)
- преобразует любой из четырех типов данных 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 может быть отформатирован в формате Prettyprint , что может сделать дальнейшую обработку строк ненадежной.
Булевы функции
[ редактировать ]- нет ( логическое значение )
- отрицает любое логическое выражение.
- истинный()
- оценивается как истинное .
- ЛОЖЬ()
- оценивается как ложь .
Числовые функции
[ редактировать ]- сумма ( набор узлов )
- преобразует строковые значения всех узлов, найденных аргументом XPath, в числа в соответствии со встроенными правилами приведения, а затем возвращает сумму этих чисел.
Примеры использования
[ редактировать ]Выражения можно создавать внутри предикатов с помощью операторов: =, !=, <=, <, >=
и >
. Логические выражения можно комбинировать с скобками. ()
и логические операторы and
и or
а также not()
функция описана выше. В числовых расчетах можно использовать *, +, -, div
и mod
. Строки могут состоять из любых Юникода символов .
//item[@price > 2*@discount]
выбирает товары, атрибут цены которых более чем в два раза превышает числовое значение их атрибута скидки.
Целые наборы узлов могут быть объединены ( «объединены» ) с помощью символа вертикальной черты |. Наборы узлов, соответствующие одному или нескольким условиям, можно найти путем объединения условий внутри предиката с помощью ' 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="Polish">pl.wikipedia.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
/Wikimedia/projects/project/@name
выбирает атрибуты имени для всех проектов и
/Wikimedia//editions
выбирает все редакции всех проектов и
/Wikimedia/projects/project/editions/edition[@language='English']/text()
выбирает адреса всех англоязычных проектов Викимедиа (текст всех edition
элементы, где language
атрибут равен английскому ). И следующее
/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()
выбирает адреса всех Википедий (текст всех edition
элементы, существующие под project
элемент с атрибутом name из Википедии ).
Реализации
[ редактировать ]Инструменты командной строки
[ редактировать ]- XMLStarlet простой в использовании инструмент для тестирования/выполнения команд XPath на лету.
- xmlint (libxml2)
- Сервер RaptorXML от Altova поддерживает XPath 1.0, 2.0 и 3.0.
- Ксидель
С/С++
[ редактировать ]Бесплатный Паскаль
[ редактировать ]- Модуль XPath включен в библиотеки по умолчанию.
Реализации для механизмов баз данных
[ редактировать ]Ява
[ редактировать ]- 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
Ява
упаковка javax.xml.xpath
был частью стандартной версии Java, начиная с Java 5. [8] через Java API для обработки XML . Технически это XPath API , а не реализация XPath, и он позволяет программисту выбрать конкретную реализацию, соответствующую интерфейсу.
JavaScript
[ редактировать ]- Плагин jQuery XPath , основанный на реализации XPath 2.0 с открытым исходным кодом на JavaScript.
- FontoXPath Реализация XPath 3.1 с открытым исходным кодом на JavaScript. В настоящее время находится в разработке.
.NET Framework
[ редактировать ]- В пространствах имен System.Xml и System.Xml.XPath [9]
- XML-база данных Седны
Перл
[ редактировать ]- XML::LibXML (libxml2)
PHP
[ редактировать ]- XML-база данных Седны
- DOMXPath через расширение libxml
Питон
[ редактировать ]- в XML API ElementTree стандартной библиотеке Python включает ограниченную поддержку выражений XPath.
- libxml2
- Амара
- XML-база данных Седны
- lxml
- лоскутный [10]
Руби
[ редактировать ]Схема
[ редактировать ]- XML-база данных Седны
SQL
[ редактировать ]- MySQL поддерживает подмножество XPath, начиная с версии 5.1.5. [11]
- PostgreSQL поддерживает XPath и XSLT, начиная с версии 8.4. [12]
Ткл
[ редактировать ]- Пакет tDOM обеспечивает полную, совместимую и быструю реализацию XPath на C. [13]
Использование в языках схем
[ редактировать ]XPath все чаще используется для выражения ограничений на языках схем XML.
- (ныне стандарт ISO ) Язык схем Schematron стал пионером в этом подходе.
- Подмножество потоковой передачи XPath используется в W3C XML Schema 1.0 для выражения уникальности и ключевых ограничений. В XSD 1.1 использование XPath расширено для поддержки условного назначения типа на основе значений атрибута и позволяет оценивать произвольные логические утверждения по содержимому элементов.
- XForms использует XPath для привязки типов к значениям.
- Этот подход даже нашел применение в приложениях, не использующих XML, таких как анализатор исходного кода для Java под названием PMD : Java преобразуется в DOM -подобное дерево разбора, затем над деревом определяются правила XPath.
См. также
[ редактировать ]Примечания
[ редактировать ]- ^ XPath 2.0 поддерживает атомарные типы, определенные как встроенные типы в схеме XML , а также может импортировать определяемые пользователем типы из схемы.
- ^ Авторитет XML Normal Walsh поддерживает отличную онлайн-визуализацию спецификаторов осей. [7] Из иллюстрации видно, что предшествующий , ancestor , self , потомок и последующие образуют полный, упорядоченный, непересекающийся раздел дерева элементов документа.
- ^ Полное описание см. в документе «Рекомендации W3C» .
Ссылки
[ редактировать ]- ^ Jump up to: а б «Хронология стандартов XML и семантической сети W3C» (PDF) . 04 февраля 2012 г.
- ^ Бержерон, Рэнди (31 октября 2000 г.). «XPath — получение узлов из XML-документа» . Журнал SQL Server . Архивировано из оригинала 26 июля 2010 г. Проверено 24 февраля 2011 г.
- ^ Пьер Женев (2012). «Курс: Язык XPath» (PDF) .
- ^ «Язык путей XML (XPath) 3.0» . Консорциум Всемирной паутины (W3C) . 2 апреля 2014 г. Проверено 16 июля 2021 г.
- ^ Кей, Майкл (10 февраля 2012 г.). «Что нового в версии 3.0 (XSLT/XPath/XQuery) (плюс схема XML 1.1)» (PDF) . XML Прага 2012 . Проверено 16 июля 2021 г.
- ^ «Язык путей XML (XPath) 3.1» . Консорциум Всемирной паутины (W3C) . 21 марта 2017 г. Проверено 16 июля 2021 г.
- ^ Уолш, Норман (1999). «Спецификаторы осей» . nwalsh.com . Личный блог почитаемого XML-мудреца Седобородого . Проверено 25 февраля 2021 г.
- ^ «javax.xml.xpath (Java SE 10 и JDK 10)» . Спецификация API платформы Java®, стандартной версии и пакета разработки Java версии 10 . Проверено 17 июля 2021 г.
С: 1,5
- ^ «Пространство имен System.Xml» . Документы Майкрософт . 2020-10-25 . Проверено 16 июля 2021 г.
- ^
Дюк, Джастин (29 сентября 2016 г.). «Как просканировать веб-страницу с помощью Scrapy и Python 3» . Цифровой океан . Проверено 24 ноября 2017 г.
Селекторы — это шаблоны, которые мы можем использовать для поиска одного или нескольких элементов на странице, чтобы затем работать с данными внутри элемента. Scrapy поддерживает либо селекторы CSS, либо селекторы XPath.
- ^ «MySQL :: Справочное руководство MySQL 5.1 :: 12.11 Функции XML» . dev.mysql.com . 06 апреля 2016 г. Архивировано из оригинала 6 апреля 2016 г. Проверено 17 июля 2021 г.
{{cite web}}
: CS1 maint: неподходящий URL ( ссылка ) - ^ "xml2" . Документация PostgreSQL . 24 июля 2014 г. Проверено 16 июля 2021 г.
- ^ Лёвер, Йохен (2000). «tDOM — быстрый пакет XML/DOM/XPath для Tcl, написанный на C» (PDF) . Материалы первого европейского собрания пользователей TCL/Tk . Проверено 16 июля 2021 г.
Внешние ссылки
[ редактировать ]- Спецификация 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 Developer Network
- Введение/руководство по XPath
- Справочник по функциям XSLT и XPath