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?

Написання правильних виразів вимагає розуміння структури документа та тестування на реальних даних. Цей інструмент надає інтерактивне середовище для перебору виразів без налаштування проекту або написання шаблонного коду.

Миттєве тестування виразів
Вставте XML, введіть вираз і побачте відповідні вузли в реальному часі. Без кроку компіляції, без налаштування REPL, без встановлення залежностей.
🔒
Конфіденційність за замовчуванням
Весь парсинг XML та виконання запитів відбуваються у браузері за допомогою нативних API DOMParser та document.evaluate(). Ваші XML-дані ніколи не покидають вашу машину.
🔍
Покрокове відлагодження складних запитів
Розбивайте довгі вирази, тестуючи кожну вісь і предикат окремо. Дивіться, які саме вузли відповідають на кожному кроці, щоб локалізувати помилки.
📋
Копіюйте результати для документації
Копіюйте відповідні вузли або скалярні результати одним кліком. Зручно для вставки у звіти про помилки, твердження тестів або скрипти витягування даних.

Сценарії використання XPath Tester

Frontend-розробник
Тестуйте XPath-селектори для маніпуляцій із SVG або XML-конфігурацій перед вбудовуванням їх у JavaScript-код, що викликає document.evaluate().
Backend-інженер
Перевіряйте запити проти SOAP-відповідей або пейлоадів XML API перед написанням логіки витягування даних на Python, Java або Go.
DevOps та інфраструктура
Запитуйте XML-конфігураційні файли (Maven pom.xml, Spring beans, конфігурації CI-пайплайнів) для витягування версій залежностей або перевірки налаштувань без редагування файлів.
QA та тестова автоматизація
Створюйте та перевіряйте XPath-локатори для Selenium або Playwright перед додаванням їх до тестових скриптів. Тестуйте крайні випадки: відсутні атрибути або префікси просторів імен.
Інженер з даних
Прототипуйте запити для XML-потоків даних (RSS, Atom, фінансові звіти XBRL) перед підключенням їх до ETL-пайплайнів.
Студент / той, хто навчається
Експериментуйте з осями XPath, предикатами та функціями на прикладах XML. Переглядайте результати миттєво, щоб розвинути інтуїцію щодо шаблонів обходу дерева.

Довідник осей XPath

Вісь визначає напрямок навігації відносно поточного (контекстного) вузла. Повний синтаксис: axis::node-test[predicate], хоча більшість розробників щодня використовують скорочені форми (//, @, ..). У таблиці наведено всі осі версії 1.0 з практичними прикладами.

ВісьПрикладОпис
childchild::bookDirect children named "book"
descendantdescendant::titleAll "title" elements at any depth
parentparent::*The parent of the current node
ancestorancestor::catalogAll ancestors named "catalog"
following-siblingfollowing-sibling::bookSiblings after the current node
preceding-siblingpreceding-sibling::bookSiblings before the current node
attributeattribute::langThe "lang" attribute of the node
selfself::bookThe current node if it is "book"
descendant-or-self//titleShorthand: any "title" in the tree
ancestor-or-selfancestor-or-self::*Current node plus all ancestors

Функції XPath 1.0

Мова визначає 27 вбудованих функцій у чотирьох категоріях: node-set, рядкові, числові та булеві. Це функції, які найчастіше використовуються при написанні запитів. Усі вони підтримуються цим тестером і кожною сумісною реалізацією.

ФункціяКатегоріяОпис
text()Node testSelects text content of a node
position()NumericReturns 1-based position in node set
last()NumericReturns size of current node set
count()NumericCounts nodes: count(//book)
contains()Stringcontains(@class, "active") — substring match
starts-with()Stringstarts-with(title, "The") — prefix match
normalize-space()StringStrips leading/trailing whitespace
string-length()NumericReturns character count of a string
sum()Numericsum(//price) — totals numeric values
not()Booleannot(@disabled) — negation
name()StringReturns element or attribute name

Приклади коду

Ці приклади показують, як виконувати вирази програмно. Кожен фрагмент використовує однакову структуру catalog.xml, щоб можна було порівняти відмінності між API різних мов.

JavaScript (browser)
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.98
Python (lxml)
from 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)  # → True
Java (javax.xml.xpath)
import 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
CLI (xmllint)
# 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

Часті запитання

У чому різниця між XPath 1.0 та XPath 3.1?
Версія 1.0 має чотири типи даних (node-set, рядок, число, булеве) та 27 функцій. Версія 3.1 додає послідовності, відображення, масиви, типи дати/часу, регулярні вирази, функції вищого порядку та підтримку JSON. Браузери та більшість стандартних бібліотек реалізують лише версію 1.0. Версія 3.1 вимагає спеціалізованого рушія на кшталт Saxon.
Як вибрати вузли з певним значенням атрибута?
Використовуйте предикат зі скороченням @ для осі атрибутів. Наприклад, //book[@category="fiction"] вибирає всі елементи book, у яких атрибут category дорівнює "fiction". Можна комбінувати кілька предикатів: //book[@category="fiction"][@year > 2000].
Чому мій XPath не повертає результатів, хоча XML містить відповідні елементи?
Найпоширеніша причина — простори імен XML. Якщо ваш XML оголошує простір імен за замовчуванням (xmlns="..."), елементи належать до цього простору імен навіть без префікса. У версії 1.0 необхідно зареєструвати простір імен і використовувати префікс у виразі. У JavaScript для браузера передайте розв'язувач простору імен третім аргументом до document.evaluate().
Чи може XPath змінювати вміст XML?
Ні. Це мова запитів лише для читання. Вона вибирає та обчислює вузли, але не може вставляти, видаляти або оновлювати їх. Для змінення XML використовуйте XSLT-трансформації, методи маніпуляції DOM або бібліотеку на кшталт Python lxml, яка надає окремі API для редагування.
Що означає подвійний слеш (//) у XPath?
Подвійний слеш — це скорочення осі descendant-or-self. Вираз //title означає «вибрати всі елементи title будь-де в дереві документа, на будь-якій глибині». Він еквівалентний повній формі /descendant-or-self::node()/title. Використання // на початку виразу виконує пошук по всьому документу; використання в середині шляху (як /catalog//title) виконує пошук серед нащадків конкретного вузла.
Як вибрати текстовий вміст замість вузла елемента?
Додайте /text() до свого виразу. Наприклад, //book/title/text() повертає текстовий вміст кожного елемента title як рядковий вузол, а не сам вузол елемента. У коді можна також звертатися до .textContent поверненого вузла елемента без використання text().
Чи є XPath швидшим за CSS-селектори для запитів до XML?
CSS-селектори оптимізовані для HTML та обходу DOM у браузерах. XPath виразніший: підтримує обхід до батьківського вузла, осі сусідніх вузлів, числові предикати та вбудовані функції, які CSS-селектори не можуть виразити. Для HTML CSS-селектори (querySelector) зазвичай швидші. Для XML більшість серверних бібліотек надають лише XPath — CSS-селектори взагалі не є варіантом.