9

私の XML は以下の例のように構成されています。dom4j を使用して XML から属性値を取得しようとしています。

<baz>
  <foo>
    <bar a="1" b="2" c="3" />
    <bar a="4" b="5" c="6" />
  </foo>
</baz>

現在、ノードは次のコードでリストに格納されています。

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

をキャストしてNodeから、またはメソッドElementを使用する必要があります。attributeattributeValue

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 に答える