0

这是我的 XML 文件的示例:

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

我从未使用过DOM4J并且我已经阅读了文档,但我似乎无法将子元素放入ArrayList'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()

有什么建议吗?

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

4

2 回答 2

1


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

方法1选择所有元素 agregator1,然后仅验证属性值(如果等于 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
}
于 2013-05-28T08:23:04.600 回答
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);
}
于 2013-05-28T12:42:16.000 回答