如何使用 JDOM 自动化 XML 解析

发布于 2024-11-29 14:17:32 字数 1579 浏览 1 评论 0原文

我必须使用 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();
        }   
    }
}

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

谢谢。

I have to parse an XML file using JDOM and get some infos from all his elements.

<?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> 

So, for the element1 it's easy. But for the element2 I have to go through his children and if the children has children go through them too and so on.

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

What do you suggest in this case, like a recursive call or something else so I can use the same function.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽清梦 2024-12-06 14:17:32

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

(假设此文档没有混合内容。)

这是 一篇关于使用 SAX 处理复杂 XML 文档的文章,它将我简要描述的内容扩展为处理递归数据结构的方法。 (它还有一篇前作文章 SAX 简介。)

I would use SAX. I'd keep a stack in the contenthandler that tracked what my current path was in the document, and keep a buffer that my characters method appended to. In endElement I'd get the content from the buffer and clear it out, then use the current path to decide what to do with it.

(this is assuming this document has no mixed-content.)

Here's a link to an article on using SAX to process complex XML documents, it expands on what I briefly described into an approach that handles recursive data structures. (It also has a predecessor article that is an introduction to SAX.)

↘紸啶 2024-12-06 14:17:32

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

You could consider using XPath to get the exact elements you want. The example here uses namespaces but the basic idea holds.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文