在 Java 中使用 DOM 从 XML 文档获取数据

问题描述 投票:0回答:1

我尝试使用 DOM 解析 XML 文件,但最后仅输出最后一个条目多次(循环中)。请告诉我,有什么问题吗? (我是Java初学者)

XML 大约包含以下内容:

<channel>
    <title>www.google.com</title>
    <item>
        <title>www.youtube.com</title>
    </item>
    <item>
        <title>play.google.com</title>
    </item>
    ...
</channel>

Java代码:

    Node item = null;
    NodeList channelList = document.getElementsByTagName("channel");
    for (int i = 0; i < channelList.getLength(); i++){

        if (channelList.item(i).getNodeType() == Node.ELEMENT_NODE){
            
            NodeList channelListChild = channelList.item(i).getChildNodes();
            for (int j = 0; j < channelListChild.getLength(); j++){
                if (channelListChild.item(j).getNodeType() == Node.ELEMENT_NODE){

                    switch (channelListChild.item(j).getNodeName()){
                        case "title":{
                            String title = channelListChild.item(j).getTextContent();
                            System.out.println(title);
                            break;
                        }
                        case "item":{
                            item = channelListChild.item(j);
                            break;
                        }
                    }
                }
            }
        }
    }
    if (item == null){
        return;
    }

    String title = null;
    NodeList itemList = item.getChildNodes();

    for (int i = 0; i < itemList.getLength(); i++){
        if (itemList.item(i).getNodeType() == Node.ELEMENT_NODE){

            switch (itemList.item(i).getNodeName()){
                case "title":{
                    title = itemList.item(i).getTextContent();
                    break;
                }
            }
        }
        System.out.println(title);
    }
    
java xml parsing dom
1个回答
0
投票

您在循环中依次将变量“item”分配给每个项目,因此退出时其值是遇到的最后一个

item
元素。

您并不是唯一一个在此类应用程序中使用 Java 和 DOM 的人。这是一个流行的组合。但它已经接近25岁了,还有很多更好的选择可供选择。即使必须是 Java,还有其他 API,例如 JDOM2 和 XOM,使用起来更加友好。

Saxon 的树导航 API(受到 C# 世界中 LINQ 的启发)看起来像这样:

XdmNode channel = document.getOutermostElement();
String title = channel.select(child("title")).asString();
System.out.println(title);
channel.select(child("item")).forEach(item -> {
   String subtitle = item.select("title").asString();
   System.out.println(subtitle);
}

这是等效 DOM 代码长度的一小部分。

【免责声明:Saxon是我公司的产品】

© www.soinside.com 2019 - 2024. All rights reserved.