使用 DOM 解析 xml 时如何处理缺少标签?

How to handle missing tag when parsing xml using DOM?

提问人:Илья Величко 提问时间:11/8/2023 更新时间:11/9/2023 访问量:38

问:

我正在尝试使用DOM进行XML解析,但问题是某些地方缺少标签。告诉我如何处理这种情况,以便在没有这种情况的情况下,将其他一些字符串写入 ArrayList(例如,“无数据”)?我是 Java 新手。我按照教程做了

类似内容的 XML:

<item>
<title>number 1</title>
</item>

<item>
<title>number 2</title>
<enclosure url="https://www.google.com/"/>
</item>

Java 代码的一部分:

List<String> title = new ArrayList<>(); 
List<String> enclosure = new ArrayList<>();

NodeList itemNodeList = document.getElementsByTagName("item");
for (int i = 0; i < itemNodeList.getLength(); i++){
    if (itemNodeList.item(i).getNodeType() == Node.ELEMENT_NODE){
        Element itemElement = (Element) itemNodeList.item(i);

        NodeList childNodes = itemElement.getChildNodes();
        for (int j = 0; j < childNodes.getLength(); j++){
            if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE){
                Element childElement = (Element) childNodes.item(j);
                
                switch (childElement.getNodeName()){
                    case "title":{
                        title.add(childElement.getTextContent());  
                        break;
                    }
                    case "enclosure":{
                        String info = childElement.getAttribute("url");
                        enclosure.add(info); 
                        break;
                    }
                }
            }
        }
    }
}
Java XML 解析 DOM

评论

0赞 aled 11/8/2023
您正在尝试解析无效的 XML?预期结果是错误。
0赞 jtahlborn 11/8/2023
您的问题实际上与 XML 解析无关。您实际上是在问如何处理您期望存在的数据,但事实并非如此(XML 本身是有效的)。这完全取决于您作为开发人员。如果允许数据丢失,那么您应该继续前进。如果数据是必需的,则应抛出异常或向用户返回其他一些适当的错误。
0赞 Yitzhak Khabinsky 11/8/2023
在提出问题时,您需要提供一个最小的可重现示例:请编辑您的原始问题并提供以下内容:(1) 格式正确的 XML 文件示例。(2)你需要做什么,即逻辑,以及你的代码尝试实现它。(3) 基于上述 #1 中的示例数据的预期输出。问题中的所有内容都是文本,没有图像。
0赞 queeg 11/8/2023
@jtahlborn 请区分格式正确和有效。文档在通过语法 (=schema) 测试时有效。
0赞 queeg 11/8/2023
@aled 有效/无效的 XML 需要进行架构检查。只要这种情况没有发生,他试图解析的只是格式正确的 XML,或者他会得到一些语法错误。

答:

0赞 queeg 11/8/2023 #1

您正在将 XML 解析为 DOM 结构,因为您所需要的只是一个语法正确的 XML 文档。内部人士将谈论一份“格式良好”的文件。

现在,您希望强制只使用特定标记,并且可能希望强制它们以正确的数量或顺序出现。在这里,您需要定义哪些标签、出现的频率和顺序。 此类信息进入语法,该语法将在 XML 架构中定义。通过语法检查的文档称为有效文档。

W3C 对 XML Schema Part0: Primer 这个主题有一个很好的介绍。

如果您认为对于您的小示例来说,这太难处理了,则可以将验证放入您的应用程序中。在 DOM 树上,检查元素是否具有预期的子节点。或者检查它是否具有预期的属性。如果缺少默认值,则代码可能会使用默认值。 但是,如果您的文档变得越来越复杂,基于模式的方法会突然看起来更简单、更易于维护。

1赞 John Bollinger 11/8/2023 #2

告诉我如何处理这种情况,以便在没有这种情况的情况下,将其他一些字符串写入 ArrayList(例如,“无数据”)?

如果您想要“title”和“enclosure”值的默认值,请按项目设置它们。例如

        // ...
        Element itemElement = (Element) itemNodeList.item(i);
        String itemTitle = "No title";
        String itemEnclosure = "no data";
        // ...

然后,在分析子节点时适当地替换这些节点,而不是立即更新列表。例如

                    // ...
                    case "enclosure":{
                        itemEnclosure = childElement.getAttribute("url");
                        break;
                    }
                    // ...

在处理了每个项节点的所有子节点后,无论该信息是从子节点读取的还是保留默认值,都可以将其添加到列表中:

        // ...
        for (int j = 0; j < childNodes.getLength(); j++){
            // ...
        }
        title.add(itemTitle);
        enclosure.add(itemEnclosure);
        // ...

但请注意,如果您的任何物品包含多个标题或多个附件,则其中一些将不会被捕获。如果您希望能够支持这样的倍数,那么您需要为数据提供不同的内部表示形式。