gpt4 book ai didi

java - SAX 转换器和 之后的行尾

转载 作者:行者123 更新时间:2023-11-30 06:30:32 25 4
gpt4 key购买 nike

为了编写 xml 代码,我使用以下代码:

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamWriter;
...
XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = xMLOutputFactory.createXMLStreamWriter(stringWriter);
writer.writeStartDocument("UTF-8", "1.0");
writer.writeCharacters("\n");
//I tried also writer.writeCharacters(System.getProperty("line.separator"));
writer.writeStartElement("settings");
...

要将一行 xml 转换为多行普通 xml 格式,我使用以下代码:

public String transform(final String xml) throws XMLStreamException, TransformerException {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
Writer writer = new StringWriter();
transformer.transform(new StreamSource(new StringReader(xml)), new StreamResult(writer));
return writer.toString();
}

这就是结果

<?xml version="1.0" encoding="UTF-8"?><settings>
...
</settings>

如您所见 <settings位于第一行。我怎样才能做<settings>移动到第二行得到以下结果

<?xml version="1.0" encoding="UTF-8"?>
<settings>
...
</settings>

怎么做?

最佳答案

假设您正在使用 Java 附带的内置 XSLT 处理器。这是一个 XSLT 1.0 处理器,因此我们需要查看 XSLT 1.0 规范。

这就是 XSLT 1.0 关于 indent="yes"的说法:

If the indent attribute has the value yes, then the xml output method may output whitespace in addition to the whitespace in the result tree (possibly based on whitespace stripped from either the source document or the stylesheet) in order to indent the result nicely; if the indent attribute has the value no, it should not output any additional whitespace. The default value is no. The xml output method should use an algorithm to output additional whitespace that ensures that the result if whitespace were to be stripped from the output using the process described in [3.4 Whitespace Stripping] with the set of whitespace-preserving elements consisting of just xsl:text would be the same when additional whitespace is output as when additional whitespace is not output.

这一切都相当复杂,但底线是处理器可以在您想要的位置输出换行符,但没有义务这样做。

如果您使用 Saxon 作为 XSLT 处理器,那么它此时会输出换行符。

但是你还没有说为什么这个换行符对你来说如此重要。你描述没有它作为一个“问题”,但为什么它是一个问题呢?如果您使用标准 XML 解析器解析生成的文档,则此时的任何换行符都将被忽略。在一种情况下,它会产生影响,即如果您生成的 XML 用作合并到某个较大文档中的外部解析实体。但对于这种情况,你绝对不需要换行符(这也许就是 Xalan 不输出它的原因)。

注意:另请参阅 Remove space in between doctype in XML using XSLT这次用户提示序列化输出中的换行符,在这种情况下是不需要的。如果您关心同一文档的替代序列化之间的差异,这不会影响任何一致的解析器处理文档的方式,那么(a)您可能必须编写自己的序列化程序,(b)您'我们将失去 XML 的主要优点之一,即可以使用许多符合标准的工具,并且 (c) 您做错了什么:可能使用不符合标准的解析器(或根本不使用解析器)来处理生成的XML。

关于java - SAX 转换器和 <?xml ... ?> 之后的行尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245803/

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