Loading AI tools
З Вікіпедії, вільної енциклопедії
XPath, або XML Path Language — це мова запитів, для вибору вузлів з XML документів, або для обчислення величин (наприклад, рядкових, числових або булевих) на основі вмісту XML документа. XPath був розроблений World Wide Web Consortium (W3C).[1]
XPath | |
---|---|
![]() | |
Парадигма | Мова запитів |
Дата появи | 1999 |
Розробник | W3C |
Останній реліз | 3.0 (2014-04-08) |
Основні реалізації | C#, Java, JavaScript |
Під впливом від | XSLT, XPointer |
Вплинула на | XML Schema, XForms |
Мова XPath основана на представленні XML документа у вигляді дерева, і надає можливість навігації по дереву, та вибору його вузлів за різними критеріями.[2][3] Популярно (проте не в офіційній специфікації) XPath-вирази називають просто «XPath».
На початку покликаний надати загальний синтаксис і модель поведінки між XPointer та XSLT, XPath швидко здобув визнання розробників як мова малих запитів, і його підмножини використовуються в інших W3C специфікаціях. Це, наприклад, XML Schema, XForms і Internationalization Tag Set (ITS)[en].
На сьогоднішній день є три версії мови XPath. Остання — версія 3.0 (10.04.2014), але XPath 1.0 все ще є найбільш вживаною.[1]
for
, що є урізаною версією «FLWOR» виразів в XQuery. Можливо описати мову, перераховуючи частини XQuery, що не включає: головні приклади, які є прологами запиту, елемент та атрибут конструкторів, іншу частину «FLWOR» синтаксису, і вираз typeswitch
.Найбільш важливий тип виразу в XPath є шлях до файлу. Шлях до файлу складається з послідовності каталогів. Кожен каталог містить три компоненти:
Вираз XPath обчислюється по відношенню до контекстного вузла. Осі, такий як 'child' або 'descendant', описують шлях для навігації від контекстного вузла. Визначення вузла і предикати використовуються для фільтрування вузлів, означених віссю. Наприклад, визначення вузла 'A' вимагають від інших напрямлених вузлів мати позначку 'A'. Предикат може використовуватися з метою зазначити, що вибрані вузли мають певні властивості (самовизначені XPath виразами).
Синтаксис XPath поставляється в двох варіантах: скорочений синтаксис (що є більш компактним і дозволяє XPath виразам бути легко написаними і прочитаними, використовуючи інтуїтивні і в багатьох випадках звичні характеристики і конструктори. Розширений синтаксис є менш компактний, але дозволяє описати більше опцій, є більш наочний.
Компактне позначення дозволяє багато за замовчуванням і скорочень для загальних випадків. Для даного XML документу
<A>
<B>
<C/>
</B>
</A>
найпростіший XPath вираз
/A/B/C
обирає ті елементи C, що є дітьми B, що в свою чергу є дітьми A, що є найбільш віддаленим елементом (в даному разі коренем) цього XML документу. Синтаксис XPath є розроблений, щоб імітувати URI і синтаксис шляху до файлу.
Більш складні вирази можуть бути сконструйовані вибором осі, відмінної від 'child' ('child' — вісь за замовчуванням), даних вузла (не просто імені) чи предикатів, що можуть бути записані в квадратних дужках на кожному кроці. Наприклад, вираз
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::*[position()=1]
Тут на кожному кроці вісь(наприклад, child
or descendant-or-self
) вказується явно, потім пишуть ::
і потім визначення вузла, так як A
або node()
в розглянутих прикладах.
Осі вказують на напрям навігації по дереві XML документа. Є такі осі:
Розширений синтаксис | Скорочений синтаксис | Пояснення |
---|---|---|
ancestor | Вибирає всіх предків (батька, прабатька і т. д.) поточного вузла | |
ancestor-or-self | Вибирає всіх предків (батька, прабатька і т. д.) поточного вузла і його самого | |
attribute |
@ |
Вибирає всі атрибути поточного вузла |
child | Вибирає всіх дітей поточного вузла | |
descendant | Вибирає всіх нащадків (дітей, внуків і т. д.) поточного вузла | |
descendant-or-self |
// |
Вибирає всіх нащадків (дітей, внуків і т. д.) поточного вузла і його самого |
following | Вибирає все в документі після закриваючого тегу поточного вузла | |
following-sibling | Вибирає всіх «братів» після поточного вузла | |
namespace | Вибирає всі вузли простору імен поточного вузла | |
parent |
.. |
Вибирає всіх батьків поточного вузла |
preceding | Вибирає всі вузли, що з'являлись перед поточним вузлом у документі, крім предків, вузлів з атрибутами і вузлів простору імен | |
preceding-sibling | Вибирає всіх «братів» перед поточним вузлом | |
self |
. |
Вибирає поточний вузол |
Розглянемо приклад використання осі following-sibling на наступному XML документі:
<items>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
</items>
XPath вираз
items/item/following-sibling::item[position()='2']
поверне '34' — значення третього і четвертого вузлів <item>, тобто тих, що йдуть після <item> на другій позиції.
Для демонстрації роботи descendant використаємо наступний XML документ:
<items>
<item>
<page>page1</page>
<page>page2</page>
<page>page3</page>
</item>
<item>2</item>
<item>3</item>
<item>4</item>
</items>
Написавши наступне
descendant::items/item[position()='1']
отримаємо 'page1 page2 page3', тобто значення всіх нащадків <item>, що стоїть на першій позиції.
Як приклад використання осі attribute в скороченому синтаксисі, //a/@href
вибирає атрибути з назвою href
в усіх a
елементах, що зустрічаються в документі.
Вираз . (скорочений запис від self::node()) найчастіше використовується в предикаті, щоб звернутись до поточного вузла.
Наприклад, h3[.='See also']
вибирає елемент в поточному контексті з назвою h3
із значенням See also
.
Визначення вузла може складатися з конкретних імен вузлів або більш загальних виразів. У разі, якщо в XML документі був визначений префікс простору імен gs
, //gs:enquiry
знайде всі enquiry
елементи в цьому просторі імен, і //gs:*
знайде всі елементи, незалежно від локальної назви, в цьому просторі імен.
Іншими форматами визначення вузла є:
<!-- Comment -->
)hello world
в <k>hello<m> world</m></k>
)<?php echo $a; ?>
. В цьому випадку processing-instruction('php')
збігатимуться.Предикати, записані у вигляді виразів у квадратних дужках, можуть бути використані для обмеження набору вузлів, для вибору тільки тих вузлів, для яких виконується деяка умова. Наприклад, a[@href='help.php']
вибере ті a
елементи (з-поміж дітей контекстного вузла), що містять атрибут href
із значенням help.php
.
Нема обмеження на кількість предикатів, застосованих на одному кроці, і вони не повинні бути обмежені до останнього кроку в XPath виразі. Також вони можуть бути вкладені на будь-яку глибину. Шлях, визначений предикатами, починається в контексті поточного кроку і не змінює цей контекст. Всі умови повинні виконатися, щоб відбулась дія.
Коли значенням предиката є цифра, вона інтерпретується як тест на позицію (номер) вузла. Таким чином p[1]
вибирає перший p
елемент-дитину, в той час, як p[last()]
вибирає останню.
В іншим випадках значення предиката є автоматично конвертовані до булевих. Коли предикат оцінює множину вузлів, результат є true коли множина вузлів не є порожньою. Отже, 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 визначає чотири типи даних: множини вузлів, рядки, числа, логічні типи.
Доступними є наступні оператори:
Бібліотека включає стандартні функції (більше 100):
<xsl:for-each/>
).<xsl:for-each/>
).translate(«bar», «abc», «ABC»
) поверне BAr
.Вирази можуть створюватися всередині предикатів з використанням операторів: =, !=, <=, <, >=
і >
. Булеві вирази можуть комбінуватися з дужками ()
і булеві оператори and
і or
, як і функція not()
(описані вище). Числові розрахунки можуть використовувати *, +, -, div
і mod
. Рядки можуть складатися з будь-яких [Юнікод|Unicode]] характеристик.
Наприклад, вираз
//item[@price > 2*@discount]
вибирає <item>, атрибут price яких є більший числового значення їх атрибуту discount, помноженому на два.
Безліч вузлів можна 'об'єднати ', використовуючи вертикальну риску |. Множини вузлів, що задовольняють одному або більше з декількох умов можуть бути знайдені шляхом об'єднання умов всередині предиката з використанням 'or
'
Наступний вираз
v[x or y] | w[z]
повернеться один набір вузлів, що складається з усіх v
елементів, таких що мають x
або y
дітей-елементів, так само, як і зі всіх w
елементів, що мають z
дітей-елементів, що були знайдені в даному контексті.Даний простий 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
повертає атрибут name для всіх <project>;
/wikimedia//editions
вибирає всі <edition> всіх <project>;
/wikimedia/projects/project/editions/edition[@language="English"]/text()
вибирає адреси всіх <project> з англійської Вікіпедії (текст всіх edition елементів, де значення атрибута language є English);
/wikimedia/projects/project[@name="Wikipedia"]/editions/edition/text()
вибирає адреси всіх Вікіпедій (текст всіх edition елементів, що існують під project елементом із значенням Wikipedia атрибута name).
Пакет Java був частиною Java стандартної версії, починаючи з Java 5. Технічно це XPath API, а не реалізація XPath, і це дозволяє програмісту можливість вибрати конкретну реалізацію, що відповідає інтерфейсу.
XPath все частіше використовується, щоб виражати обмеження, що накладаються мовами схем для XML.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.