Получение значения атрибута из узла с помощью 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
Большое спасибо. Я не знал, что узлы можно преобразовать в элементы. Чем больше ты знаешь! - 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); вернет не строку, а объект атрибута - 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