ToolDeck

Kiểm tra XPath

Kiểm tra biểu thức XPath đối với XML và xem tất cả các nút khớp

Thử ví dụ

Nhập XML

Chạy cục bộ · An toàn để dán thông tin bí mật

XPath là gì?

XPath (XML Path Language) là ngôn ngữ truy vấn dùng để chọn các nút từ một tài liệu XML. Được W3C định nghĩa như một phần của chuẩn XSLT, XPath coi tài liệu XML như một cây nút và cung cấp cú pháp dựa trên đường dẫn để điều hướng cây đó. Một biểu thức XPath như //book[@category="fiction"]/title sẽ chọn mọi phần tử title bên trong phần tử book có thuộc tính category bằng "fiction". XPath 1.0, phiên bản được mọi trình duyệt lớn và hầu hết các thư viện XML hỗ trợ, được công bố là Khuyến nghị W3C vào năm 1999 và vẫn là phiên bản được triển khai rộng rãi nhất.

Biểu thức XPath trả về một trong bốn kiểu kết quả: node-set, chuỗi, số, hoặc boolean. Node-set là kết quả phổ biến nhất và chứa không hoặc nhiều nút XML (phần tử, thuộc tính, nút văn bản, chú thích, hoặc chỉ thị xử lý). Kết quả chuỗi, số và boolean đến từ các hàm XPath như count(), sum(), contains(), và các phép so sánh boolean. Hệ thống kiểu này làm cho XPath phù hợp cả với việc trích xuất dữ liệu lẫn viết logic điều kiện trong các stylesheet XSLT và các xác nhận XML Schema.

Biểu thức phiên bản 1.0 hoạt động ở mọi nơi: document.evaluate() trong JavaScript, lxml và ElementTree của Python, javax.xml.xpath của Java, DOMXPath của PHP, và các công cụ dòng lệnh như xmllint. Phiên bản 2.0 và 3.1 bổ sung hệ thống kiểu phong phú hơn và nhiều hàm hơn nhưng yêu cầu các engine chuyên dụng như Saxon. Hãy sử dụng phiên bản 1.0 theo mặc định. Chỉ dùng 2.0 hoặc 3.1 khi bạn cần sequence, biểu thức chính quy, hoặc hàm bậc cao — và chấp nhận phụ thuộc vào Saxon hoặc BaseX.

Tại sao sử dụng công cụ kiểm tra XPath trực tuyến?

Viết biểu thức đúng đòi hỏi phải hiểu cấu trúc tài liệu và kiểm thử với dữ liệu thực. Công cụ này cung cấp môi trường tương tác để thử nghiệm các biểu thức mà không cần thiết lập dự án hay viết mã khởi tạo.

Kiểm tra biểu thức tức thì
Dán XML, nhập biểu thức và xem các nút khớp theo thời gian thực. Không cần bước biên dịch, không cần cài đặt REPL, không cần cài đặt phụ thuộc.
🔒
Xử lý ưu tiên quyền riêng tư
Toàn bộ quá trình phân tích XML và đánh giá truy vấn chạy trong trình duyệt bằng các API DOMParser và document.evaluate() gốc. Dữ liệu XML của bạn không bao giờ rời khỏi máy.
🔍
Gỡ lỗi truy vấn phức tạp từng bước
Phân tách biểu thức dài bằng cách kiểm tra từng trục và vị từ riêng lẻ. Xem chính xác các nút khớp ở mỗi bước để xác định lỗi.
📋
Sao chép kết quả để lập tài liệu
Sao chép các nút khớp hoặc kết quả vô hướng chỉ với một cú nhấp. Hữu ích để dán vào báo cáo lỗi, xác nhận kiểm thử, hoặc các đoạn trích xuất dữ liệu.

Các trường hợp sử dụng công cụ kiểm tra XPath

Lập trình viên frontend
Kiểm tra bộ chọn XPath để thao tác SVG hoặc cấu hình XML trước khi nhúng chúng vào mã JavaScript gọi document.evaluate().
Kỹ sư backend
Xác thực truy vấn đối với các phản hồi SOAP hoặc tải trọng XML API trước khi viết logic trích xuất trong Python, Java, hoặc Go.
DevOps / Hạ tầng
Truy vấn các tệp cấu hình XML (Maven pom.xml, Spring beans, cấu hình CI pipeline) để trích xuất phiên bản phụ thuộc hoặc xác minh cài đặt mà không cần chỉnh sửa tệp.
QA / Kiểm thử tự động
Xây dựng và xác minh bộ định vị XPath cho Selenium hoặc Playwright trước khi thêm chúng vào các tập lệnh kiểm thử. Kiểm tra các trường hợp biên như thuộc tính bị thiếu hoặc tiền tố không gian tên.
Kỹ sư dữ liệu
Tạo nguyên mẫu truy vấn cho các luồng dữ liệu XML (RSS, Atom, báo cáo tài chính XBRL) trước khi kết nối chúng vào các pipeline ETL.
Sinh viên / Người học
Thử nghiệm với các trục, vị từ và hàm XPath bằng cách sử dụng XML mẫu. Xem kết quả ngay lập tức để xây dựng trực giác về các mẫu duyệt cây.

Tài liệu tham khảo trục XPath

Một trục xác định hướng điều hướng tương đối với nút hiện tại (nút ngữ cảnh). Cú pháp đầy đủ là axis::node-test[predicate], mặc dù hầu hết các lập trình viên sử dụng dạng viết tắt (//, @, ..) hàng ngày. Bảng này liệt kê tất cả các trục phiên bản 1.0 với các ví dụ thực tế.

TrụcVí dụMô tả
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

Hàm XPath 1.0

Ngôn ngữ định nghĩa 27 hàm tích hợp trong bốn danh mục: node-set, chuỗi, số, và boolean. Đây là các hàm bạn sẽ sử dụng thường xuyên nhất khi viết truy vấn. Tất cả đều được công cụ này hỗ trợ và được mọi triển khai tuân thủ chuẩn hỗ trợ.

HàmDanh mụcMô tả
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

Ví dụ mã

Các ví dụ này cho thấy cách đánh giá biểu thức theo chương trình. Mỗi đoạn mã sử dụng cùng một cấu trúc catalog.xml để bạn có thể so sánh sự khác biệt về API giữa các ngôn ngữ.

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

Câu hỏi thường gặp

Sự khác biệt giữa XPath 1.0 và XPath 3.1 là gì?
Phiên bản 1.0 có bốn kiểu dữ liệu (node-set, chuỗi, số, boolean) và 27 hàm. Phiên bản 3.1 bổ sung sequence, map, mảng, kiểu ngày/giờ, biểu thức chính quy, hàm bậc cao, và hỗ trợ JSON. Trình duyệt và hầu hết các thư viện chuẩn chỉ triển khai phiên bản 1.0. Phiên bản 3.1 yêu cầu engine chuyên dụng như Saxon.
Làm thế nào để chọn các nút với giá trị thuộc tính cụ thể?
Sử dụng vị từ với ký hiệu tắt @ cho trục thuộc tính. Ví dụ, //book[@category="fiction"] chọn tất cả phần tử book có thuộc tính category bằng "fiction". Bạn có thể kết hợp nhiều vị từ: //book[@category="fiction"][@year > 2000].
Tại sao XPath của tôi không trả về kết quả dù XML có chứa các phần tử khớp?
Nguyên nhân phổ biến nhất là không gian tên XML. Nếu XML của bạn khai báo không gian tên mặc định (xmlns="..."), các phần tử thuộc về không gian tên đó dù không có tiền tố. Trong phiên bản 1.0, bạn phải đăng ký không gian tên và sử dụng tiền tố trong biểu thức. Trong JavaScript trình duyệt, hãy truyền trình phân giải không gian tên làm đối số thứ ba cho document.evaluate().
XPath có thể sửa đổi nội dung XML không?
Không. Đây là ngôn ngữ truy vấn chỉ đọc. Nó chọn và đánh giá các nút nhưng không thể chèn, xóa hay cập nhật chúng. Để sửa đổi XML, hãy sử dụng biến đổi XSLT, các phương thức thao tác DOM, hoặc thư viện như lxml của Python có API riêng để chỉnh sửa.
Dấu gạch chéo kép (//) trong XPath có nghĩa là gì?
Dấu gạch chéo kép là cách viết tắt của trục descendant-or-self. Biểu thức //title có nghĩa là "chọn tất cả phần tử title ở bất kỳ đâu trong cây tài liệu, ở bất kỳ độ sâu nào." Nó tương đương với dạng đầy đủ /descendant-or-self::node()/title. Sử dụng // ở đầu biểu thức sẽ tìm kiếm toàn bộ tài liệu; sử dụng ở giữa đường dẫn (như /catalog//title) sẽ tìm kiếm các con cháu của một nút cụ thể.
Làm thế nào để chọn nội dung văn bản thay vì nút phần tử?
Thêm /text() vào cuối biểu thức. Ví dụ, //book/title/text() trả về nội dung văn bản của mỗi phần tử title dưới dạng nút chuỗi, thay vì bản thân nút phần tử. Trong mã, bạn cũng có thể truy cập .textContent trên nút phần tử được trả về mà không cần dùng text().
XPath có nhanh hơn bộ chọn CSS khi truy vấn XML không?
Bộ chọn CSS được tối ưu hóa cho HTML và duyệt DOM trong trình duyệt. XPath có khả năng biểu đạt phong phú hơn: nó hỗ trợ duyệt phần tử cha, trục anh chị em, vị từ số, và các hàm tích hợp mà bộ chọn CSS không thể biểu đạt. Đối với HTML, bộ chọn CSS (querySelector) thường nhanh hơn. Đối với XML, hầu hết các thư viện phía máy chủ chỉ cung cấp XPath — bộ chọn CSS không phải là một lựa chọn.