Jump to content

XPath

XPath
Парадигма Язык запросов
Разработчик W3C
Впервые появился 1998
Стабильная версия
3.1 / 21 марта 2017 г .; 7 лет назад ( 21.03.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, примененное к XML-файлу

Синтаксис и семантика (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-документа. Доступные оси: [б]

Спецификаторы осей в XPath
Полный синтаксис Сокращенный синтаксис Примечания
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 включен в библиотеки по умолчанию.

Реализации для механизмов баз данных

[ редактировать ]

Ява упаковка javax.xml.xpath был частью стандартной версии Java, начиная с Java 5. [8] через Java API для обработки XML . Технически это XPath API , а не реализация XPath, и он позволяет программисту выбрать конкретную реализацию, соответствующую интерфейсу.

  • В пространствах имен System.Xml и System.Xml.XPath [9]
  • XML-база данных Седны
  • XML-база данных Седны
  • DOMXPath через расширение libxml
  • XML-база данных Седны
  • 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.

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ XPath 2.0 поддерживает атомарные типы, определенные как встроенные типы в схеме XML , а также может импортировать определяемые пользователем типы из схемы.
  2. ^ Авторитет XML Normal Walsh поддерживает отличную онлайн-визуализацию спецификаторов осей. [7] Из иллюстрации видно, что предшествующий , ancestor , self , потомок и последующие образуют полный, упорядоченный, непересекающийся раздел дерева элементов документа.
  3. ^ Полное описание см. в документе «Рекомендации W3C» .
  1. ^ Jump up to: а б «Хронология стандартов XML и семантической сети W3C» (PDF) . 04 февраля 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: неподходящий URL ( ссылка )
  12. ^ "xml2" . Документация PostgreSQL . 24 июля 2014 г. Проверено 16 июля 2021 г.
  13. ^ Лёвер, Йохен (2000). «tDOM — быстрый пакет XML/DOM/XPath для Tcl, написанный на C» (PDF) . Материалы первого европейского собрания пользователей TCL/Tk . Проверено 16 июля 2021 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c612632b5e116b089b2178fb8716b671__1721778600
URL1:https://arc.ask3.ru/arc/aa/c6/71/c612632b5e116b089b2178fb8716b671.html
Заголовок, (Title) документа по адресу, URL1:
XPath - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)