【问题标题】:How can I automate the XML Parsing using JDOM如何使用 JDOM 自动化 XML 解析
【发布时间】:2011-08-16 15:23:53
【问题描述】:

我必须使用 JDOM 解析一个 XML 文件并从他的所有元素中获取一些信息。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <element1>something</element1>
    <element2>
        <subelement21>moo</subelement21>
        <subelement22>
            <subelement221>toto</subelement221>
            <subelement222>tata</subelement222>
        </subelement22>
    </element2>
</root> 

所以,对于 element1 来说,这很容易。但是对于 element2,我必须通过他的孩子,如果孩子有孩子,也要通过他们等等。

public static void getInfos(Vector<String> files) {     
    Document document = null;
    Element root = null;

    SAXBuilder sxb = new SAXBuilder();

    for (int i =0 ; i< files.size() ; i++)
    {
        System.out.println("n°" + i + " : " + files.elementAt(i));
        try
        {
            document = sxb.build(files.elementAt(i));
            root = document.getRootElement();

            List<?> listElements = root.getChildren();
            Iterator<?> it = listElements.iterator();

            while(it.hasNext())
            {
                Element courant = (Element)it.next();
                System.out.println(courant.getName());

                if(courant.getChildren().size() > 0)
                {
                    // here is the problem -> the element has a children
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }   
    }
}

在这种情况下你有什么建议,比如递归调用或其他什么,以便我可以使用相同的函数。

谢谢。

【问题讨论】:

    标签: java element sax root jdom


    【解决方案1】:

    我会使用 SAX。我会在 contenthandler 中保留一个堆栈,用于跟踪我在文档中的当前路径,并保留我的 characters 方法附加到的缓冲区。在 endElement 中,我会从缓冲区中获取内容并将其清除,然后使用当前路径来决定如何处理它。

    (这是假设该文档没有混合内容。)

    这是一个指向an article on using SAX to process complex XML documents 的链接,它将我简要描述的内容扩展为一种处理递归数据结构的方法。 (它还有一篇前文是an introduction to SAX。)

    【讨论】:

    • 混合内容是什么意思
    • @OpenMind:混合内容就像你在 html 中看到的那样,你有像“asdfzxcvqwerty”这样的东西,所以 有多个元素文本节点。
    • 我的 xml 文件中有很多这样的东西,所以我认为你的方法对我不起作用?
    • @OpenMind:我不确定,没有例子很难知道(你在问题中的例子没有任何混合内容)。可能它只需要跟踪更多关于推送或弹出堆栈的信息。
    【解决方案2】:

    您可以考虑使用XPath 来获取您想要的确切元素。示例 here 使用命名空间,但基本思想仍然成立。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2011-10-02
      相关资源
      最近更新 更多