在 Java 中解析 XML 时有多余的子元素

Posted

技术标签:

【中文标题】在 Java 中解析 XML 时有多余的子元素【英文标题】:Excess child elements when parsing XML in Java 【发布时间】:2022-01-19 08:42:53 【问题描述】:

我有 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<questions>
    <question>
        <name>First question</name>
        <true>2</true>
        <answers>
            <answer>First answer</answer>
            <answer>Second answer</answer>
            <answer>Third answer</answer>
            <answer>Fourth answer</answer>
        </answers>
    </question>
    <question>
        <name>Second question</name>
        <true>3</true>
        <answers>
            <answer>First answer</answer>
            <answer>Second answer</answer>
            <answer>Third answer</answer>
            <answer>Fourth answer</answer>
        </answers>
    </question>
</questions>

为什么当下面的Java代码执行时,它返回了9个元素而不是4个,并且错误的5个元素包含一个换行符和3个制表符,在&lt;answers&gt;&lt;answer&gt;(一个)之间,&lt;/answer&gt;&lt;answer&gt;(三个)、&lt;/answer&gt;&lt;/answers&gt;(一个)在 XML 中:

File file = new File(path);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(file);
NodeList answers = doc.getElementsByTagName("answers").item(n).getChildNodes();

接下来,我做一个检查以切断错误的元素:

if (answers.item(i).getTextContent().trim().length() > 0)

如果您能告诉我一个更好的方法,我将不胜感激。

【问题讨论】:

【参考方案1】:

它没有返回 9 个 元素 - 它返回 9 个 节点,这是正确的。 (毕竟,您要的是answers 元素的子节点。)那些只有空白的文本节点是有效节点。如果你想要元素,只需忽略 Node.getNodeType() 不返回 Node.ELEMENT_NODE 的任何节点。

或者,只需在 answers 元素上调用 getElementsByTagName("answer") 即可获取元素。这是假设您很乐意忽略任何非answer 元素。例如:

Element answersElement = (Element) doc.getElementsByTagName("answers").item(n);
NodeList answerElements = answersElement.getElementsByTagName("answer");

【讨论】:

第二种方法只能得到一个特定的答案或所有的答案,但我需要一个特定问题的答案列表。 @Sergei:请重新阅读我的建议,您调用getElementsByTagName("answer") answers 元素上尝试从中找到答案。不在文件上。 乔恩,谢谢!它有效

以上是关于在 Java 中解析 XML 时有多余的子元素的主要内容,如果未能解决你的问题,请参考以下文章

mybatis系列笔记---SqlMapConfig.xml解析

BFC

在XSL上解析具有相同名称的子元素

Python将XML解析为缺少元素的CSV

xml解析之----DOM解析

关于java解析xml文件出现的问题