我的XML结构类似于下面的示例。我正在尝试使用dom4j从XML中获取属性值。
<baz>
<foo>
<bar a="1" b="2" c="3" />
<bar a="4" b="5" c="6" />
</foo>
</baz>
目前,节点存储在List中,代码如下:
public List<Foo> getFoo() {
String FOO_XPATH = "//baz/foo/*";
List<Foo> fooList = new ArrayList<Foo>();
List<Node> fooNodes = _bazFile.selectNodes(FOO_XPATH);
for (Node n : fooNodes) {
String a = /* get attribute a */
String b = /* get attribute b */
String c = /* get attribute c */
fooNodes.add(new Foo(a, b, c));
}
return fooNodes;
}
There is a similar but different question在SO上,但是使用以下代码返回已知属性键/值对的节点值:
Node value = elem.selectSingleNode("val[@a='1']/text()");
在我的情况下,代码知道密钥但不知道值 - 这就是我需要存储的内容。 (当我需要属性值时,类似问题/答案的上述片段也会返回节点的文本值。)
答案 0 :(得分:18)
您必须将Node
转换为Element
,然后使用attribute
或attributeValue
方法:
for (Node node : fooNodes) {
Element element = (Element) node;
String a = element.attributeValue("a");
...
}
基本上,从“任何节点”获取属性值没有意义,因为某些节点类型(属性,文本节点)不具有属性。
答案 1 :(得分:1)
public List<Foo> getFoo() {
String FOO_XPATH = "//baz/foo/*";
List<Foo> fooList = new ArrayList<Foo>();
List<Node> fooNodes = _bazFile.selectNodes(FOO_XPATH);
for (Node n : fooNodes) {
Element element = (Element) n;
String a = element.attributeValue("a");
String b = element.attributeValue("b");
String c = element.attributeValue("c");
fooNodes.add(new Foo(a, b, c));
}
return fooNodes;
}
我认为您需要将节点转换为元素,然后才能正常工作。
答案 2 :(得分:0)
您还可以使用xpath获取节点属性的值 -
for (Node n : fooNodes) {
String a = n.valueOf("@a");
String b = n.valueOf("@b");
String c = n.valueOf("@c");
fooNodes.add(new Foo(a, b, c));
}