XPath - XPath
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
Парадигма | Язык запроса |
---|---|
Разработчик | W3C |
Впервые появился | 1998 |
Стабильный выпуск | 3.1 / 21 марта 2017 г. |
Под влиянием | |
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 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-документа. Доступны следующие оси:
Полный синтаксис | Сокращенный синтаксис | Примечания |
---|---|---|
предок | ||
предок или я | ||
атрибут | @ | @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 включен в библиотеки по умолчанию
Реализации для движков баз данных
Ява
- Саксонский 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 [10] через 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[11]
- База данных Sedna XML
Perl
- XML :: LibXML (libxml2)
PHP
- База данных Sedna XML
- DOMXPath через расширение libxml
Python
- В ElementTree XML API в стандартной библиотеке Python включает ограниченная поддержка для выражений XPath
- libxml2
- Амара
- База данных Sedna XML
- lxml
- Scrapy[12]
Рубин
Схема
- База данных 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 определяются для дерева.
Смотрите также
Рекомендации
- ^ а б «Хронология стандартов XML и семантической сети W3C» (PDF). 2012-02-04.
- ^ "умный редактор для XPath". 2020-07-29.
- ^ Бержерон, Рэнди (31 октября 2000 г.). «XPath - получение узлов из XML-документа». Журнал SQL Server. Архивировано из оригинал 26 июля 2010 г.. Получено 24 февраля, 2011.
- ^ Пьер Женев (Октябрь 2012 г.). «Курс: язык XPath» (PDF).
- ^ XPath 2.0 поддерживает атомарные типы, определенные как встроенные типы в Схема XML, а также может импортировать определяемые пользователем типы из схемы.
- ^ Рекомендация XPath 3.0 W3C
- ^ Что нового в версии 3.0 (XSLT / XPath / XQuery) (плюс XML Schema 1.1) Майкл Кей, Saxonica
- ^ Полное описание см. документ с рекомендациями W3C
- ^ Кроуэлл, Уильям (2016). "XML-процессор Pavuk" (PDF). www.pavuk.com.
- ^ https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/package-summary.html
- ^ System.Xml пространство имен
- ^ Герцог, Джастин (29 сентября 2016 г.). «Как сканировать веб-страницу с помощью Scrapy и Python 3». Цифровой океан. Архивировано из оригинал 4 октября 2017 г.. Получено 24 ноября 2017.
Селекторы - это шаблоны, которые мы можем использовать для поиска одного или нескольких элементов на странице, чтобы затем мы могли работать с данными внутри элемента. scrapy поддерживает селекторы CSS или XPath.
- ^ http://xmlsoft.org/
- ^ http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html
- ^ Онлайн-документы на postgresql.org
внешняя ссылка
- Спецификация XPath 1.0
- Спецификация XPath 2.0
- Спецификация XPath 3.0
- Спецификация XPath 3.1
- Что нового в XPath 2.0
- Справочник по XPath (MSDN)
- Синтаксис выражения XPath (саксонский)
- Синтаксис выражений XPath 2.0 (Saxon), [1]
- XPath - Документы MDC к Сеть разработчиков Mozilla
- Введение / руководство по XPath
- Справочник по функциям XSLT и XPath