2013-01-09 39 views
143

Tôi có theo XML.XPath để chọn Phần tử theo giá trị thuộc tính

<?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 có id = "4".

Tôi đang sử dụng biểu thức XPath bên dưới không trả lại bất kỳ thứ gì.

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

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

Trả lời

215

Bạn cần xóa / trước số [. Predicates (các bộ phận trong []) không nên có dấu gạch ngang ngay trước chúng. Ngoài ra, để chọn chính yếu tố Nhân viên, bạn nên để lại /text() ở cuối hoặc nếu không bạn chỉ đang 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'] 

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

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

Lưu ý rằng ' // 'chọn và tìm kiếm trên * tất 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 thì sử dụng một đường dẫn thích hợp, như được đề xuất trong câu trả lời [Gilles '] (http://stackoverflow.com/questions/14248063/xpath-to-select-element-by-attribute-value # 14248129) bên dưới. – Jens

+0

@ 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ụ lục. – JLRishe

8

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

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

có xmllint 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 là 46 GB và tôi đang tìm kiếm id trong đó –

Các vấn đề liên quan