【问题标题】:Getting attribute value from node using dom4j使用 dom4j 从节点获取属性值
【发布时间】:2012-09-05 14:45:40
【问题描述】:

我的 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()");

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

【问题讨论】:

    标签: java dom4j


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢。我不知道节点可以转换为元素。你知道的越多!
    【解决方案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));
      }
    

    【讨论】:

    • n.valueOf("@a");不会返回一个字符串,而是一个 Attribute 对象
    【解决方案3】:
    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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多