gpt4 book ai didi

java - XML 缩进在 `document.setXmlStandalone(true)` 之后搞砸了

转载 作者:行者123 更新时间:2023-11-30 08:34:16 30 4
gpt4 key购买 nike

我正在使用 DOM 创建一个 XML 文档:

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
//document.setXmlStandalone(true);

Element root = document.createElement("root");
document.appendChild(root);
root.appendChild(document.createElement("childElement"));
document.insertBefore(document.createComment("some comment"), root);

我想漂亮地输出生成的 XML 并使用它来实现它:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

到目前为止,它工作得很好,但输出弄乱了我在文档的根元素之前添加的 XML 注释。输出:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--some comment--><root>
<childElement/>
</root>

如果我取消注释 //document.setXmlStandalone(true) 这行,它会更加困惑格式:

<?xml version="1.0" encoding="UTF-8"?><!--some comment--><root>
<childElement/>
</root>

如您所见,注释后的换行符(以及序言后的第二个示例中的换行符)丢失了!

在 C++ 中,XML 库 xerces-c++ 可以通过在根节点之前添加一个文本节点(它只包含一个换行符)来处理这些问题,但这不适用于 Java-DOM!

有没有办法(除了自己添加注释和序言)让 DOM 正确格式化我的 Xml?

最佳答案

当我将 Saxon 9.7 HE 放在类路径上时(这样 Saxon 就被用作 Transformer)代码

    Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
document.setXmlStandalone(true);

Element root = document.createElement("root");
document.appendChild(root);
root.appendChild(document.createElement("childElement"));
document.insertBefore(document.createComment("some comment"), root);

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

transformer.transform(new DOMSource(document), new StreamResult(System.out));

产生输出

<?xml version="1.0" encoding="UTF-8"?>
<!--some comment-->
<root>
<childElement/>
</root>

也许这对您来说是一个选择,如果您的项目需要,除了改进缩进之外,它还为您提供 XSLT 2.0 和 XPath 2.0/3.0。

关于java - XML 缩进在 `document.setXmlStandalone(true)` 之后搞砸了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918915/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com