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-выражения возвращают один из четырёх типов результатов: наборы узлов, строки, числа или булевы значения. Набор узлов — наиболее распространённый результат; он содержит ноль или более 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?
Написание корректных выражений требует понимания структуры документа и проверки на реальных данных. Инструмент даёт интерактивную среду для итеративной работы над выражениями без необходимости создавать проект или писать шаблонный код.
Сценарии использования 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 встроенных функций четырёх категорий: наборы узлов, строки, числа и булевы значения. Это функции, которые вы будете использовать чаще всего при написании запросов. Все они поддерживаются данным инструментом и каждой совместимой реализацией.
| Функция | Категория | Описание |
|---|---|---|
| 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