stringtranslate.com

XPath

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]

Выражение XPath, примененное к XML-файлу

Синтаксис и семантика (XPath 1.0)

Самый важный вид выражения в XPath — это путь к местоположению . Путь местоположения состоит из последовательности шагов местоположения . Каждый шаг местоположения состоит из трех компонентов:

Выражение XPath оценивается относительно узла контекста . Спецификатор оси, такой как «дочерний» или «потомок», указывает направление перехода от узла контекста. Тест узла и предикат используются для фильтрации узлов, указанных спецификатором оси: например, тест узла «A» требует, чтобы все узлы, к которым осуществляется переход, имели метку «A». Предикат можно использовать для указания того, что выбранные узлы обладают определенными свойствами, которые задаются самими выражениями XPath.

Синтаксис XPath существует в двух вариантах: сокращенный синтаксис более компактен и позволяет легко писать и читать XPath, используя интуитивно понятные и во многих случаях знакомые символы и конструкции. Полный синтаксис более подробный, но позволяет указать больше опций и является более информативным, если его внимательно прочитать.

Сокращенный синтаксис

Компактная нотация допускает множество значений по умолчанию и сокращений для распространенных случаев. Учитывая исходный XML, содержащий как минимум

<A> <B> <C/> </B> </A>   

простейший XPath принимает такую ​​форму, как

который выбирает элементы C, являющиеся дочерними элементами B, которые являются дочерними элементами элемента A, образующего самый внешний элемент XML-документа. Синтаксис XPath предназначен для имитации URI ( унифицированного идентификатора ресурса ) и синтаксиса пути к файлу в стиле Unix .

Более сложные выражения можно построить, указав ось, отличную от «дочерней» оси по умолчанию, проверку узла, отличную от простого имени, или предикаты, которые можно записать в квадратных скобках после любого шага. Например, выражение

выбирает первого дочернего элемента (' *[1]'), независимо от его имени, каждого элемента B, который сам является дочерним или другим, более глубоким потомком (' //') элемента A, который является дочерним элементом текущего узла контекста (выражение не начинается с ' /'). Предикат [1]связывается более жестко, чем /оператор. Чтобы выбрать первый узел, выбранный выражением A//B/*, напишите (A//B/*)[1]. Также обратите внимание, что значения индексов в предикатах XPath (технически «положения близости» наборов узлов XPath) начинаются с 1, а не с 0, как это обычно бывает в таких языках, как C и Java.

Расширенный синтаксис

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

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

Здесь то же самое, но короче:A//B/*[position()=1]

Спецификаторы оси

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

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

Тесты узлов

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

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

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

Предикаты

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

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

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

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

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

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

Функции и операторы

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

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

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

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

Функции набора узлов

позиция()
возвращает число, представляющее позицию этого узла в последовательности узлов, обрабатываемых в данный момент (например, узлы, выбранные с помощью инструкции 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"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, и он позволяет программисту выбрать конкретную реализацию, соответствующую интерфейсу.

JavaScript

.NET Framework

Перл

PHP

Питон

Рубин

Схема

SQL

Ткл

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

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

Смотрите также

Примечания

  1. ^ XPath 2.0 поддерживает атомарные типы, определенные как встроенные типы в схеме XML , а также может импортировать определяемые пользователем типы из схемы.
  2. ^ Авторитет XML Normal Walsh поддерживает отличную онлайн-визуализацию спецификаторов осей. [7] Из иллюстрации видно, что предшествующий , ancestor , self , потомок и последующие образуют полный, упорядоченный, непересекающийся раздел дерева элементов документа.
  3. ^ Полное описание см. в документе «Рекомендации W3C».

Рекомендации

  1. ^ ab «Хронология стандартов XML и семантической сети W3C» (PDF) . 04.02.2012.
  2. ^ Бержерон, Рэнди (31 октября 2000 г.). «XPath — получение узлов из XML-документа». Журнал SQL Server . Архивировано из оригинала 26 июля 2010 г. Проверено 24 февраля 2011 г.
  3. ^ Пьер Женев (2012). «Курс: Язык XPath» (PDF) .
  4. ^ «Язык путей XML (XPath) 3.0» . Консорциум Всемирной паутины (W3C) . 2 апреля 2014 г. Проверено 16 июля 2021 г.
  5. ^ Кей, Майкл (10 февраля 2012 г.). «Что нового в версии 3.0 (XSLT/XPath/XQuery) (плюс схема XML 1.1)» (PDF) . XML Прага 2012 . Проверено 16 июля 2021 г.
  6. ^ «Язык путей XML (XPath) 3.1» . Консорциум Всемирной паутины (W3C) . 21 марта 2017 г. Проверено 16 июля 2021 г.
  7. ^ Уолш, Норман (1999). «Спецификаторы осей». nwalsh.com . Личный блог почитаемого XML-мудреца Седобородого . Проверено 25 февраля 2021 г.
  8. ^ "javax.xml.xpath (Java SE 10 и JDK 10)" . Спецификация API платформы Java®, стандартной версии и пакета разработки Java версии 10 . Проверено 17 июля 2021 г. С: 1,5
  9. ^ «Пространство имен System.Xml». Документы Майкрософт . 2020-10-25 . Проверено 16 июля 2021 г.
  10. ^ Дюк, Джастин (29 сентября 2016 г.). «Как просканировать веб-страницу с помощью Scrapy и Python 3». Цифровой океан . Проверено 24 ноября 2017 г. Селекторы — это шаблоны, которые мы можем использовать для поиска одного или нескольких элементов на странице, чтобы затем работать с данными внутри элемента. Scrapy поддерживает либо селекторы CSS, либо селекторы XPath.
  11. ^ «MySQL :: Справочное руководство MySQL 5.1 :: 12.11 Функции XML» . dev.mysql.com . 06 апреля 2016 г. Архивировано из оригинала 6 апреля 2016 г. Проверено 17 июля 2021 г.{{cite web}}: CS1 maint: unfit URL (link)
  12. ^ "xml2". Документация PostgreSQL . 24 июля 2014 г. Проверено 16 июля 2021 г.
  13. ^ Лёвер, Йохен (2000). «tDOM — быстрый пакет XML/DOM/XPath для Tcl, написанный на C» (PDF) . Материалы первого европейского собрания пользователей TCL/Tk . Проверено 16 июля 2021 г.

Внешние ссылки