2010-03-17 304 views
5

我在java中使用xpath。我想獲取元素的所有屬性(名稱&值)。我發現查詢獲取元素的屬性值,現在我想單獨獲取屬性名稱或單個查詢中的名稱和值。Xpath - 如何獲取元素的所有屬性名稱和值

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

這裏使用下面的查詢來獲取的Element1 XmlUtils.getAttributes(Path, String.format("//*/@*")); 的所有屬性值使用這種格式//*/@*我能得到的值。結果將是value1 value2 value3 value4 value5 a123

現在我想知道查詢獲取所有屬性名稱,或查詢獲取所有屬性的名稱和值。

回答

22

要選擇名爲Element1的文檔中的所有元素的所有屬性://Element1/@*。這將返回包含屬性的節點集 節點。然後您可以迭代節點集。

如果您已經有一個上下文節點並希望在其下查找結果,則查詢將爲.//Element1/@*。這通常比查詢整個文檔更高效。

// 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(); 
} 

它可能是更有效地找到使用getElementsByTagName給定名稱的所有元素。

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

以獲取特定元素的屬性,它的重複屬性財產

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

偉大答!我正在尋找這個!謝謝! (Btw ...有一個錯字,它是字符串,而不是字符串) – 2010-10-26 07:09:19

1

我不得不這樣做在Oracle Service Bus和有隻使用XPath來創建一個緩存鍵,並且爲我工作的解決方案做的是:

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(), ':', .), '_') 
) 
相關問題