XPath Tester
Тестуйте вирази XPath проти XML та переглядайте всі відповідні вузли
XML-введення
Що таке XPath?
XPath (XML Path Language) — це мова запитів для вибору вузлів із XML-документа. Визначена W3C як частина стандарту XSLT, XPath розглядає XML-документ як дерево вузлів і надає синтаксис на основі шляхів для навігації цим деревом. Вираз XPath на кшталт //book[@category="fiction"]/title вибирає кожен елемент title всередині елемента book, атрибут category якого дорівнює "fiction". XPath 1.0 — версія, що підтримується всіма основними браузерами та більшістю XML-бібліотек — опублікована як Рекомендація W3C у 1999 році та залишається найпоширенішою версією.
Вирази XPath повертають один із чотирьох типів результатів: node-set, рядки, числа або булеві значення. Node-set — найпоширеніший результат — містить нуль або більше XML-вузлів (елементи, атрибути, текстові вузли, коментарі або інструкції обробки). Рядкові, числові та булеві результати повертають функції XPath: count(), sum(), contains() та булеві порівняння. Ця система типів робить XPath придатним як для витягування даних, так і для написання умовної логіки в XSLT-таблицях стилів та твердженнях XML Schema.
Вирази версії 1.0 працюють скрізь: у JavaScript через document.evaluate(), у Python через lxml та ElementTree, у Java через javax.xml.xpath, у PHP через DOMXPath, а також у командному рядку через xmllint. Версії 2.0 та 3.1 додають розширені системи типів і функції, але вимагають спеціалізованих рушіїв на кшталт Saxon. Використовуйте версію 1.0 за замовчуванням. Переходьте на 2.0 або 3.1 лише тоді, коли потрібні послідовності, регулярні вирази або функції вищого порядку — і приймайте залежність від Saxon або BaseX.
Навіщо використовувати онлайн XPath Tester?
Написання правильних виразів вимагає розуміння структури документа та тестування на реальних даних. Цей інструмент надає інтерактивне середовище для перебору виразів без налаштування проекту або написання шаблонного коду.
Сценарії використання XPath Tester
Довідник осей XPath
Вісь визначає напрямок навігації відносно поточного (контекстного) вузла. Повний синтаксис: axis::node-test[predicate], хоча більшість розробників щодня використовують скорочені форми (//, @, ..). У таблиці наведено всі осі версії 1.0 з практичними прикладами.
| Вісь | Приклад | Опис |
|---|---|---|
| child | child::book | Direct children named "book" |
| descendant | descendant::title | All "title" elements at any depth |
| parent | parent::* | The parent of the current node |
| ancestor | ancestor::catalog | All ancestors named "catalog" |
| following-sibling | following-sibling::book | Siblings after the current node |
| preceding-sibling | preceding-sibling::book | Siblings before the current node |
| attribute | attribute::lang | The "lang" attribute of the node |
| self | self::book | The current node if it is "book" |
| descendant-or-self | //title | Shorthand: any "title" in the tree |
| ancestor-or-self | ancestor-or-self::* | Current node plus all ancestors |
Функції XPath 1.0
Мова визначає 27 вбудованих функцій у чотирьох категоріях: node-set, рядкові, числові та булеві. Це функції, які найчастіше використовуються при написанні запитів. Усі вони підтримуються цим тестером і кожною сумісною реалізацією.
| Функція | Категорія | Опис |
|---|---|---|
| text() | Node test | Selects text content of a node |
| position() | Numeric | Returns 1-based position in node set |
| last() | Numeric | Returns size of current node set |
| count() | Numeric | Counts nodes: count(//book) |
| contains() | String | contains(@class, "active") — substring match |
| starts-with() | String | starts-with(title, "The") — prefix match |
| normalize-space() | String | Strips leading/trailing whitespace |
| string-length() | Numeric | Returns character count of a string |
| sum() | Numeric | sum(//price) — totals numeric values |
| not() | Boolean | not(@disabled) — negation |
| name() | String | Returns element or attribute name |
Приклади коду
Ці приклади показують, як виконувати вирази програмно. Кожен фрагмент використовує однакову структуру catalog.xml, щоб можна було порівняти відмінності між API різних мов.
const xml = `<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>`
const parser = new DOMParser()
const doc = parser.parseFromString(xml, 'application/xml')
// Select all book titles
const result = doc.evaluate('//book/title', doc, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null)
let node = result.iterateNext()
while (node) {
console.log(node.textContent) // → "1984", "Dune"
node = result.iterateNext()
}
// Get a numeric value
const sum = doc.evaluate('sum(//price)', doc, null, XPathResult.NUMBER_TYPE, null)
console.log(sum.numberValue) // → 20.98from lxml import etree
xml = """<catalog>
<book id="1"><title>1984</title><price>7.99</price></book>
<book id="2"><title>Dune</title><price>12.99</price></book>
</catalog>"""
tree = etree.fromstring(xml.encode())
# Select elements by attribute
books = tree.xpath('//book[@id="1"]/title/text()')
print(books) # → ['1984']
# Use predicates with position
first = tree.xpath('//book[1]/title/text()')
print(first) # → ['1984']
# Boolean check
has_cheap = tree.xpath('boolean(//price[. < 10])')
print(has_cheap) # → Trueimport javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import org.w3c.dom.*;
var factory = DocumentBuilderFactory.newInstance();
var builder = factory.newDocumentBuilder();
var doc = builder.parse(new java.io.File("catalog.xml"));
var xpath = XPathFactory.newInstance().newXPath();
// Select node set
NodeList titles = (NodeList) xpath.evaluate(
"//book/title", doc, XPathConstants.NODESET
);
for (int i = 0; i < titles.getLength(); i++) {
System.out.println(titles.item(i).getTextContent());
// → "1984", "Dune"
}
// Evaluate to number
double total = (double) xpath.evaluate(
"sum(//price)", doc, XPathConstants.NUMBER
);
System.out.println(total); // → 20.98# Select all book titles xmllint --xpath '//book/title/text()' catalog.xml # → 1984Dune # Select by attribute xmllint --xpath '//book[@id="2"]/title' catalog.xml # → <title>Dune</title> # Count nodes xmllint --xpath 'count(//book)' catalog.xml # → 2 # Using xmlstarlet for formatted output xmlstarlet sel -t -v '//book/title' -n catalog.xml # → 1984 # → Dune