XPath để chọn Element theo giá trị thuộc tính


193

Tôi đã theo XML.

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <Employee id="3">
        <age>40</age>
        <name>Tom</name>
        <gender>Male</gender>
        <role>Manager</role>
    </Employee>
    <Employee id="4">
        <age>25</age>
        <name>Meghna</name>
        <gender>Female</gender>
        <role>Manager</role>
    </Employee>
</Employees>

Tôi muốn chọn phần tử Nhân viên với id = "4".

Tôi đang sử dụng biểu thức XPath dưới đây mà không trả về bất cứ điều gì.

//Employee/[@id='4']/text()

Tôi đã kiểm tra nó tại http://chris.photobooks.com/xml/default.htmlm và nó nói xpath không hợp lệ, không chắc vấn đề ở đâu.

Câu trả lời:


274

Bạn cần phải loại bỏ /trước [. Vị ngữ (phần trong [ ]) không nên có dấu gạch chéo ngay trước chúng. Ngoài ra, để chọn chính phần tử Nhân viên, bạn nên bỏ /text()phần cuối hoặc nếu không, bạn chỉ cần chọn các giá trị văn bản khoảng trắng ngay dưới phần tử Nhân viên.

//Employee[@id='4']

Chỉnh sửa: Như Jens chỉ ra trong các bình luận, //có thể rất chậm vì nó tìm kiếm toàn bộ tài liệu cho các nút phù hợp. Nếu cấu trúc của các tài liệu bạn đang làm việc sẽ nhất quán, có lẽ bạn tốt nhất nên sử dụng một đường dẫn đầy đủ, ví dụ:

/Employees/Employee[@id='4']

3
Lưu ý rằng //chọn và tìm kiếm trên tất cả các nút của tài liệu có thể chậm. Thay vào đó, nếu cấu trúc của tài liệu được biết đến thì hãy sử dụng một đường dẫn thích hợp, như được đề xuất trong câu trả lời của Gilles bên dưới.
Jens

@Jens Vâng, điều đó hoàn toàn đúng. Tôi đã chỉnh sửa câu trả lời của mình để thêm phần phụ lục.
JLRishe

12

Hãy thử làm điều này:

/Employees/Employee[@id=4]/*/text()

xmllint có tải toàn bộ tệp xml vào bộ nhớ trước khi tìm id không?. Tôi có tệp xml 46 GB và tôi đang tìm id trong đó
Hani Goc

Tập tin xml 46 GB - có vấn đề.
Gurwinder Singh

12

Để theo dõi, bạn có thể chọn "tất cả các nút có thuộc tính cụ thể" như thế này:

//*[@id='4']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.