2010-03-17 248 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(), ':', .), '_') 
) 
相关问题