W3C Document.parse() 生成不需要的元素

W3C Document.parse() produces unwanted elements

提问人:Mario P. Waxenegger 提问时间:8/24/2023 最后编辑:Mario P. Waxenegger 更新时间:8/25/2023 访问量:39

问:

我只是制作了一个简单的XML文件:

<main>
    <foo>
        <bar>1</bar>
        <bar>2</bar>
        <bar>3</bar>
    </foo>
</main>

我只是试着用这个代码来计算内部:barsfoo

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setIgnoringElementContentWhitespace(true);

InputStream is = new FileInputStream(FILE_FORMATTED);
DocumentBuilder db = dbf.newDocumentBuilder();

Document doc = db.parse(is);
NodeList bars = doc.getElementsByTagName("foo").item(0).getChildNodes();

System.out.println(bars.getLength());

令我困惑的是,我被打印在控制台中。然后,我在调试器中检查了 NodeList 中的内容(附加屏幕截图)。解析器显然会从换行符和空格中生成一些节点。7

当我将 XML 换成没有任何格式(且可读性较差)的文件时,我打印了预期的结果。下面是另一个 XML:3

<main><foo><bar>1</bar><bar>2</bar><bar>3</bar></foo></main>

我找不到任何关于这种行为的信息。它是否不被视为用于格式化的 XML 文件?甚至没有用。dbf.setIgnoringElementContentWhitespace(true)

enter image description here

Java XML W3C

评论

5赞 Jon Skeet 8/24/2023
以前试过打电话吗?如果这是问题所在,我不会感到惊讶。(我个人不希望已经创建的 DocumentBuilder 通过对创建它的工厂进行更改来修改。setIgnoringElementContentWhitespace()newDocumentBuilder()
2赞 Dave Newton 8/25/2023
它们不是“不存在的元素”,而是您没有明确创建的元素。空格是否重要取决于上下文,而不是内容。
0赞 VGR 8/25/2023
“我找不到任何关于这种行为的信息。1. 查看 org.w3c.dom javadoc。2. 按照该 javadoc 中的链接指向 DOM 规范。3. 在“文本”一节中读到“如果元素的内容中没有标记,则文本包含在实现 Text 接口的单个对象中,该接口是元素的唯一子项。如果存在标记,则将其解析为信息项(元素、注释等)和文本节点,这些节点构成元素的子项列表。
0赞 Mario P. Waxenegger 8/25/2023
@JonSkeet对不起,实际上我确实在创建之前调用了它,我只是在帖子中粘贴了错误。 更新了它。仍然将空格解析为元素。

答:

1赞 Michael Kay 8/25/2023 #1

通常,仅空格文本节点很重要:考虑

<para>A <adj>great</adj> <adj>green</adj> <noun>dragon</noun>.</para>

因此,如果你的应用程序想要将空格视为无关紧要,你通常必须明确地告诉解析器将其丢弃。不同的 XML API 具有不同的执行此操作的方法。