Как получить атрибут родительского элемента и дочернее значение из XML в Java?

#java #xml #xml-parsing

#java #xml #xml-синтаксический анализ

Вопрос:

Например, у меня есть XML-файл:

 <parent value="first">
  <child>Bill</child>
</parent>
 

Я хочу получить на выходе: значение = первое, дочернее = Счет
Это означает, что мне нужен атрибут из родительского элемента и значение из дочернего элемента.

Я пытался сделать что-то вроде этого:

 List<Str> obj = new ArrayList<Str>();
NodeList nList  = doc.getElementsByTagName("parent");
for (int i = 0; i < nList.getLength();   i) {
    Element attrElement = (Element) nList.item(i);
    NamedNodeMap map = attrElement.getAttributes();
       for (int j = 0; j < map.getLength(); j  ) {
            Node attribute = map.item(j);
            Node eNode = nList.item(j);
            Element name = (Element) eNode;
            obj.add(new Str(attribute.getNodeValue(), name.getElementsByTagName("child").item(0).getTextContent()));
       }
    }
 

В результате у меня есть Str со значениями «null».

Ответ №1:

Используйте так

       List<String> obj = new ArrayList<String>();
      NodeList nList  = doc.getElementsByTagName("parent");
      for (int i = 0; i < nList.getLength();   i) {
          NamedNodeMap map = nList.item(i).getAttributes();
             for (int j = 0; j < map.getLength(); j  ) {
                  Node attribute = map.item(j);
                  Node eNode = nList.item(i); // Use i value here that is the issue. 
                  Element name = (Element) eNode;
                  obj.add(new String("Value = " attribute.getNodeValue()   ",Child="   
                      name.getElementsByTagName("child").item(0).getTextContent()));
             }
          }
 

Добавьте один внешний элемент, он отлично работает для нескольких тегов

 <xml><parent value=first> 
    <child>Bill</child></parent> <parent value=second> <child>Steve</child>
</parent></xml>
 

Комментарии:

1. Спасибо. Но есть проблема. У меня более одного родителя. Атрибут изменяется, но дочернее имя остается как первое. Я хотел, если <родительское значение =»первый»> <дочерний элемент> Билл</дочерний элемент> </ родительский элемент> <родительское значение = «второй»> <дочерний элемент> Стив </ дочерний элемент> </ родительский элемент> И результат, который я получаю: 1) значение = первый, дочерний элемент = Счет 2)значение = второе, дочернее = Счет, но значение = второе, дочернее = Стив должно быть.

2. Я скопировал ваш xml. В обоих случаях я получаю «Дочерний элемент = счет»

3. Пожалуйста, ознакомьтесь с обновленным кодом рядом с «Используйте значение i вместо j, которое является проблемой «.

4. Теперь все работает нормально. Спасибо.