使用dom4j从节点获取属性值

anj*_*atl 7 java dom4j

我的XML结构类似于下面的示例.我正在尝试使用dom4j从XML中获取属性值.

<baz>
  <foo>
    <bar a="1" b="2" c="3" />
    <bar a="4" b="5" c="6" />
  </foo>
</baz>
Run Code Online (Sandbox Code Playgroud)

目前,节点存储在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;
}
Run Code Online (Sandbox Code Playgroud)

这里有类似但不同的问题,但是使用以下代码返回已知属性键/值对的节点值:

Node value = elem.selectSingleNode("val[@a='1']/text()");
Run Code Online (Sandbox Code Playgroud)

在我的例子中,代码知道密钥但不知道值 - 这就是我需要存储的内容.(当我需要属性值时,类似问题/答案的上述片段也会返回节点的文本值.)

Jon*_*eet 18

你必须转换Node为Element然后使用attribute或attributeValue方法:

for (Node node : fooNodes) {
    Element element = (Element) node;
    String a = element.attributeValue("a");
    ...
}
Run Code Online (Sandbox Code Playgroud)

基本上,从"任一节点"得到的属性值是没有意义的,因为一些节点类型(属性,文本节点)不具备的属性.