Добавление подэлементов XML в ArrayList с помощью DOM4J

вот пример моего XML-файла:

<agregator1 id="CSP">
    <id>int</id>
    <type>string</type>
</agregator1>
<agregator1 id="Microgrid">     
    <id>int</id>
    <type>string</type>
</agregator1>

Я никогда не работал с DOM4J и читал документацию, но не могу вставить подэлементы в ArrayList, я пытаюсь сделать следующее:

arrayList1: id, type
arrayList2: int, string

вот мой код:

for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
    Element foo = (Element) i.next();
    if(foo.attributeValue("id").toString().equals("CSP"))
    {
      //what am I missing here?
    }
}

Я много искал, и я не могу найти решение, так как я не могу сделать foo.getChildNodes().

Любые предложения?

РЕДАКТИРОВАТЬ: мне нужно получить имена узлов без использования elementText(String) (или чего-то подобного), потому что мне нужно, чтобы мой код работал, даже если файл XML был изменен, без редактирования моего кода.


person SaintLike    schedule 27.05.2013    source источник


Ответы (2)



Я могу помочь вам с этим 2 решения:

Способ 1: выбрать все элементы агрегатора1, после чего проверить только attributeValue, если он равен CSP.

Element root = document.getRootElement();
List<Element> listElement = root.selectNodes("./agregator1");
if (listElement != null) {
    for (int j = 0; j < listElement.size(); j++) {
        Element el = listElement.get(j);
        String attrValue = el.attributeValue("id", "");
        if (attrValue.length() > 0 && attrValue.equals("CSP")) {
            // do your code
        }
    }
}
else {
    // element not found
}

Способ 2: сделайте это всего в 1 строке, используя xpath

Element rootElement = doc.getRootElement();
List<Element> elementNeeded = rootElement.selectNodes("./agregator1[@id='CSP']");
if (elementNeeded != null && elementNeeded.size() > 0) {
    // element found do your code
}
else {
    // element not found
}
person sghaier ali    schedule 28.05.2013
comment
Вы можете это сделать? Список не принимает параметры - person SaintLike; 28.05.2013
comment
Разве это не то же самое, что я сделал? Мне нужен способ получить дочерние узлы aggregator1... - person SaintLike; 28.05.2013
comment
для первого метода: элемент el (Element el = listElement.get(j);) имеет все дочерние узлы для получения одного, просто сделайте следующее: el.selectnodes(./[NameOfElementYouLike]) ==> ваш список получения для всех элементов с именем = [NameOfElementYouLike]. 2- для второго метода текущий элемент elementNeeded: этот элемент имеет все дочерние узлы - person sghaier ali; 28.05.2013

Я решил свою проблему. Спасибо всем, кто пытался помочь. Для всех людей, которые ищут подобное решение, вот мой код:

Это описанный выше метод, завершенный:

public static ArrayList<Element> readSubElements()
   {
       ArrayList<Element> subElements = new ArrayList<>();

        Element root = configs.XMLreaderDOM4J.getDoc().getRootElement();
        for (Iterator it = root.elementIterator(); it.hasNext();){
            Element foo = (Element) it.next();
            if(foo.attributeValue("id").equals("VPP"))
            {
               for (Iterator it2 = foo.elementIterator(); it2.hasNext(); )
               {
                  Element temp = (Element) it2.next();
                   subElements.add(temp);
                   System.out.println(""+temp);
               }
            }
        }

       return subElements;        
   }

И новый метод, который я создал:

public static void getTagNames() {

   ArrayList<Element> elements = readSubElements();
   ArrayList<String> list1 = new ArrayList<>();
   ArrayList<String> list2 = new ArrayList<>();
   setSize(elements.size());

   for (Iterator it = elements.iterator(); it.hasNext();) {
      Element entry = (Element) it.next();
      list1.add(entry.getQualifiedName());
      list2.add(entry.getText());
   }

   setTagNamesAL(list1);
   setTagContentAL(list2);
}
person SaintLike    schedule 28.05.2013