Эта статья поднимает множество проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалить эти сообщения-шаблоны ) ( Узнайте, как и когда удалить этот шаблон сообщения )
|
Парадигма | Язык запроса |
---|---|
Разработчик | W3C |
Впервые появился | 1998 г. |
Стабильный выпуск | 3.1 / 21 марта 2017 г . |
Под влиянием | |
XSLT , XPointer | |
Под влиянием | |
Схема XML , XForms |
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 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]
Полный синтаксис | Сокращенный синтаксис | Заметки |
---|---|---|
ancestor | ||
ancestor-or-self | ||
attribute | @ | @abc это сокращение от attribute::abc |
child | xyz это сокращение от child::xyz | |
descendant | ||
descendant-or-self | // | // это сокращение от /descendant-or-self::node()/ |
following | ||
following-sibling | ||
namespace | ||
parent | .. | .. это сокращение от parent::node() |
preceding | ||
preceding-sibling | ||
self | . | . это сокращение от self::node() |
- ^ Авторитетный XML Нормальный Уолш поддерживает отличную онлайн-визуализацию спецификаторов осей. [8] Из иллюстрации видно, что предыдущий , предок , сам , потомок и последующий образуют полный, упорядоченный, неперекрывающийся раздел дерева элементов документа.
В качестве примера использования оси атрибутов в сокращенном синтаксисе //a/@href
выбирает атрибут, вызываемый href
в a
элементах в любом месте дерева документа. Выражение . (сокращение от self :: node () ) чаще всего используется в предикате для ссылки на текущий выбранный узел. Например, h3[.='See also']
выбирает элемент, вызываемый h3
в текущем контексте, текстовое содержимое которого See also
.
Узловые тесты [ править ]
Тесты узлов могут состоять из конкретных имен узлов или более общих выражений. В случае XML-документа, в котором gs
был определен префикс пространства имен , //gs:enquiry
он найдет все enquiry
элементы в этом пространстве имен и //gs:*
найдет все элементы, независимо от локального имени, в этом пространстве имен.
Другие форматы тестирования узлов:
- комментарий()
- находит узел комментария XML, например
<!-- Comment -->
- текст()
- находит узел типа текста, например,
hello world
in<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
Ссылки [ править ]
- ^ «Временная шкала стандартов XML и семантической сети W3C» (PDF) . 2012-02-04.
- ↑ Бержерон, Рэнди (31 октября 2000 г.). «XPath - получение узлов из XML-документа» . Журнал SQL Server . Архивировано из оригинального 26 июля 2010 года . Проверено 24 февраля 2011 года .
- ^ Пьер Женев (октябрь 2012 г.). «Курс: язык XPath» (PDF) .
- ^ Ошибка цитирования: указанная ссылка
timelinehistory
была вызвана, но не была определена (см. Страницу справки ). - ^ XPath 2.0 поддерживает атомарные типы, определенные как встроенные типы в XML- схеме, а также может импортировать определяемые пользователем типы из схемы.
- ^ Рекомендация XPath 3.0 W3C
- ^ Что нового в версии 3.0 (XSLT / XPath / XQuery) (плюс XML Schema 1.1) Майкла Кея, Saxonica
- ^ Уолш, Норман (1999). "Спецификаторы осей" . nwalsh.com . Личный блог почитаемого XML мудреца седобородого . Проверено 25 февраля 2021 года . CS1 maint: обескураженный параметр ( ссылка )
- ^ Полное описание см. В документе Рекомендации 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 |
- Спецификация 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