XPath ( язык путей XML ) — это язык выражений , предназначенный для поддержки запросов или преобразования 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]
for
выражение, которое является урезанной версией выражений « FLWOR » в XQuery. Язык можно описать, перечислив части XQuery, которые он не учитывает: основными примерами являются пролог запроса, конструкторы элементов и атрибутов, остальная часть синтаксиса «FLWOR» и выражение typeswitch
.Самый важный вид выражения в 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-документа. Доступные оси: [b]
В качестве примера использования оси атрибутов в сокращенном синтаксисе //a/@href
выбирается атрибут, вызываемый href
в a
элементах в любом месте дерева документа. Выражение . (аббревиатура self::node() ) чаще всего используется внутри предиката для ссылки на текущий выбранный узел. Например, h3[.='See also']
выбирает элемент, вызываемый h3
в текущем контексте, текстовое содержимое которого — See also
.
Тесты узлов могут состоять из конкретных имен узлов или более общих выражений. В случае XML-документа, в котором gs
определен префикс пространства имен, //gs:enquiry
он найдет все enquiry
элементы в этом пространстве имен и //gs:*
найдет все элементы, независимо от локального имени, в этом пространстве имен.
Другие форматы тестирования узлов:
<!-- Comment -->
hello
in<k>hello<m> world</m></k>
<?php echo $a; ?>
processing-instruction('php')
Предикаты, записанные в виде выражений в квадратных скобках, могут использоваться для фильтрации набора узлов по некоторому условию. Например, a
возвращает набор узлов (все a
элементы, которые являются дочерними элементами контекстного узла), и сохраняет только те элементы, которые имеют атрибут со значением .a[@href='help.php']
href
help.php
Количество предикатов на шаге не ограничено, и их не обязательно ограничивать последним шагом XPath. Они также могут быть вложены на любую глубину. Пути, указанные в предикатах, начинаются с контекста текущего шага (т. е. с контекста непосредственно предшествующего теста узла) и не изменяют этот контекст. Для того чтобы произошло совпадение, все предикаты должны быть удовлетворены.
Когда значение предиката числовое, оно является синтаксическим сахаром для сравнения с позицией узла в наборе узлов (как задано функцией position()
). So 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 определяет четыре типа данных: наборы узлов (наборы узлов без внутреннего порядка), строки, числа и логические значения.
Доступные операторы:
/
, используемые в выражениях пути, как описано выше.//
[...]
|
который образует объединение двух наборов узлов.and
и or
и функцияnot()
+
, -
, *
, div
(деление) иmod
=
, !=
, <
, >
, <=
,>=
Библиотека функций включает в себя:
Некоторые из наиболее часто полезных функций подробно описаны ниже. [с]
true
, если s1
начинается сs2
true
, если s1
содержитs2
substring("ABCDEF",2,3)
возвращает BCD
.substring-before("1999/04/01","/")
возвращает1999
substring-after("1999/04/01","/")
возвращает04/01
Выражения можно создавать внутри предикатов с помощью операторов: =, !=, <=, <, >=
и >
. Логические выражения можно комбинировать с скобками ()
и логическими операторами and
, а or
также с not()
функцией, описанной выше. В числовых расчетах можно использовать *, +, -, div
и mod
. Строки могут состоять из любых символов Юникода .
//item[@price > 2*@discount]
выбирает товары, атрибут цены которых более чем в два раза превышает числовое значение их атрибута скидки.
Целые наборы узлов могут быть объединены ( «объединены» ) с помощью символа вертикальной черты |. Наборы узлов, соответствующие одному или нескольким условиям, можно найти путем объединения условий внутри предиката с помощью ' or
'.
v[x or y] | w[z]
вернет один набор узлов, состоящий из всех v
элементов, имеющих x
или y
дочерние элементы, а также всех w
элементов, имеющих z
дочерние элементы, которые были найдены в текущем контексте.
Учитывая образец XML-документа
<?xml version="1.0"coding="utf-8"?> <Wikimedia> <projects> <project name= "Wikipedia" launch= "2001-01-05" > <editions> <edition Language= "English" > en.wikipedia.org </edition> <edition Language= "Немецкий" > de.wikipedia.org </edition> <edition Language= "Французский" > fr.wikipedia.org </edition> <edition Language= "Польский" " > 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= "Вьетнамский" > vi. wiktionary.org </edition> <edition Language= "Turkish" > tr.wiktionary.org </edition> <edition Language= "Spanish" > es.wiktionary.org </edition> </editions> </project> < /проекты> </Викимедиа>
Выражение XPath
/Викимедиа/проекты/проект/@имя
выбирает атрибуты имени для всех проектов и
/Викимедиа//издания
выбирает все редакции всех проектов и
/Wikimedia/projects/project/editions/edition[@language='English']/text()
выбирает адреса всех англоязычных проектов Викимедиа (текст всех edition
элементов, у которых language
атрибут равен English ). И следующее
/Wikimedia/projects/project[@name='Wikipedia']/editions/edition/text()
выбирает адреса всех Википедий (текст всех edition
элементов, которые существуют в project
элементе с атрибутом имени Википедии ).
Пакет Javajavax.xml.xpath
является частью стандартной редакции Java, начиная с Java 5
[ 8] через API Java для обработки XML . Технически это XPath API , а не реализация XPath, и он позволяет программисту выбрать конкретную реализацию, соответствующую интерфейсу.
XPath все чаще используется для выражения ограничений в языках схем XML.
С: 1,5
Селекторы — это шаблоны, которые мы можем использовать для поиска одного или нескольких элементов на странице, чтобы затем работать с данными внутри элемента.
Scrapy поддерживает либо селекторы CSS, либо селекторы XPath.
{{cite web}}
: CS1 maint: unfit URL (link)