9

我的 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;
}

SO上有一个类似但不同的问题,但它使用以下代码返回已知属性键/值对的节点值:

Node value = elem.selectSingleNode("val[@a='1']/text()");

就我而言,代码知道键但不知道值 - 这就是我需要存储的。(当我需要属性值时,来自类似问题/答案的上述片段也会返回节点的文本值。)

4

3 回答 3

22

您必须转换NodetoElement然后使用attributeorattributeValue方法:

for (Node node : fooNodes) {
    Element element = (Element) node;
    String a = element.attributeValue("a");
    ...
}

基本上,从“任何节点”获取属性值是没有意义的,因为某些节点类型(属性、文本节点)没有属性

于 2012-09-12T14:36:03.193 回答
2

您还可以使用 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));
  }
于 2013-03-29T15:39:58.540 回答
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;
}

我认为您需要将节点转换为元素,然后才能正常工作。

于 2012-09-12T14:41:09.153 回答