2010-03-17 4 views
5

Tôi đang sử dụng xpath trong java. Tôi muốn lấy tất cả các thuộc tính (tên & Giá trị) của một phần tử. Tôi đã tìm thấy truy vấn để lấy các giá trị thuộc tính của một phần tử, bây giờ tôi muốn lấy tên thuộc tính một mình hoặc tên và giá trị trong truy vấn đơn lẻ.Xpath - Cách lấy tất cả tên thuộc tính và giá trị của một phần tử

<Element1 ID="a123" attr1="value1" attr2="value2" attr3="value3" attr4="value4" attr5="value5" /> 

Ở đây sử dụng các truy vấn sau đây để có được tất cả các giá trị thuộc tính của Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); Sử dụng định dạng này //*/@* tôi có thể nhận các giá trị. kết quả sẽ là value1 value2 value3 value4 value5 a123

Bây giờ tôi muốn biết truy vấn để có được tất cả tên thuộc tính hoặc truy vấn để nhận tất cả tên và giá trị thuộc tính.

Trả lời

22

Để chọn tất cả thuộc tính của tất cả các phần tử trong tài liệu có tên Element1: //Element1/@*. Điều này sẽ trả về một nút nodeset chứa thuộc tính nút. Sau đó bạn có thể lặp lại các nodeset.

Nếu bạn đã có nút ngữ cảnh và muốn tìm kết quả theo đó, truy vấn sẽ là .//Element1/@*. Điều này thường hiệu quả hơn truy vấn toàn bộ tài liệu.

// input is an InputSource or a DOM node 
NodeList nl = (NodeList) xpath.evaluate("//Element1/@*", input, XPathConstants.NODESET); 
int length = nl.getLength(); 
for(int i=0; i<length; i++) { 
    Attr attr = (Attr) nl.item(i); 
    String name = attr.getName(); 
    String value = attr.getValue(); 
} 

Và có thể hiệu quả hơn khi tìm tất cả các phần tử của một tên cụ thể bằng cách sử dụng getElementsByTagName.

NodeList nl = document.getElementsByTagName("Element1"); 

Để có được các thuộc tính của một yếu tố đặc biệt, lặp thuộc tính của nó tài sản.

NamedNodeMap nl = element.getAttributes(); 
int length = nl.getLength(); 
for(int i=0; i<length; i++) { 
    Attr attr = (Attr) nl.item(i); 
    String name = attr.getName(); 
    String value = attr.getValue(); 
} 
+0

ans tuyệt vời! tôi đã tìm kiếm chính xác điều này! Cảm ơn! (Btw ... có lỗi đánh máy, đó là String, không phải chuỗi) –

1

tôi phải làm điều đó trong Oracle Bus dịch vụ và phải làm chỉ sử dụng xPath để tạo ra một chìa khóa bộ nhớ cache và các giải pháp mà làm việc cho tôi là:

concat(
    string-join(//*[string-length(normalize-space(string-join(text(), ''))) > 0]/concat(local-name(), 
                         ':', 
                         normalize-space(string-join(text(), ''))), '_'), 
    '_', 
    string-join(//@*[normalize-space(.) != '']/concat(name(), ':', .), '_') 
)