【问题标题】:Adding XML sub elements to an ArrayList with DOM4J使用 DOM4J 将 XML 子元素添加到 ArrayList
【发布时间】:2023-03-26 15:40:01
【问题描述】:

这是我的 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 文件发生更改,我也需要我的代码才能工作,而无需编辑我的代码。

【问题讨论】:

    标签: java xml xml-parsing dom4j


    【解决方案1】:


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

    方法 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
    }
    

    【讨论】:

    • 你能做到吗?列表不带参数
    • 这不是我做过的一模一样吗?我需要一种方法来获取 agregator1 子节点...
    • 对于第一个方法:元素“el” (Element el = listElement.get(j);) 拥有所有子节点,只需执行以下操作:el.selectnodes("./[NameOfElementYouLike ]") ==> 获取名称为 = [NameOfElementYouLike] 的所有元素的列表。 2-对于第二种方法,您当前的元素是“elementNeeded”:该元素具有所有子节点
    【解决方案2】:

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

    就是上面的方法,完成:

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

    【讨论】:

      猜你喜欢
      • 2017-10-22
      • 2013-07-19
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      相关资源
      最近更新 更多