使用DOM4J将XML子元素添加到ArrayList

时间:2013-05-27 19:13:04

标签: java xml xml-parsing dom4j

这是我的XML文件示例:

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

我从未与DOM4J合作,而且我已经阅读了文档,但我似乎无法将子元素纳入ArrayList&#39; s ,我试图做以下事情:

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

任何sugestions?

编辑:我需要在不使用elementText(String)(或类似内容)的情况下获取节点名称,因为即使更改了XML文件,我也需要使用我的代码,而无需编辑代码。

2 个答案:

答案 0 :(得分:1)


我可以帮助你解决这两个问题:

Methode 1 选择所有元素agregator1之后,如果等于CSP,则仅验证 attributeValue。

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
}

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

答案 1 :(得分:0)

我解决了我的问题。感谢所有试图帮助的人。 对于所有寻找类似解决方案的人来说,这是我的代码:

这是上面的方法,完成了:

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