Получаване на стойност на атрибут от възел чрез dom4j

Моят XML е структуриран като примера по-долу. Опитвам се да извадя стойностите на атрибутите от XML с помощта на dom4j.

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

В моя случай кодът знае ключовете, но не знае стойностите - това е, което трябва да съхраня. (Горният фрагмент от подобен въпрос/отговор също връща текстовата стойност на възел, когато имам нужда от стойността на атрибута.)


person anjunatl    schedule 12.09.2012    source източник


Отговори (3)


Трябва да прехвърлите Node към Element и след това да използвате методите attribute или attributeValue:

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

По принцип получаването на стойността на атрибута от „всеки възел“ няма смисъл, тъй като някои типове възли (атрибути, текстови възли) нямат имат атрибути.

person Jon Skeet    schedule 12.09.2012
comment
Много благодаря. Не знаех, че възлите могат да бъдат прехвърлени към Elements. Колкото повече знаеш! - person anjunatl; 12.09.2012

Можете също да използвате 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));
  }
person Jay Shark    schedule 29.03.2013
comment
n.valueOf(@a); няма да върне низ, а обект Attribute - person Jerome Diaz; 26.04.2013

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

Мисля, че трябва да преобразувате възел в елемент, тогава само той работи добре.

person Ami    schedule 12.09.2012