SAX Transformer和<! - ?xml ...? - >之后的行尾

时间:2017-09-15 18:48:07

标签: java xml sax

要编写我的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>

怎么做?

2 个答案:

答案 0 :(得分:1)

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

这就是XSLT 1.0关于缩进=&#34;是&#34;:

的说法
  

如果indent属性的值为yes,则为xml输出方法   除了结果树中的空格外,还可以输出空格   (可能基于从源文档中剥离的空白   或者样式表)以便很好地缩进结果;如果缩进   属性值为no,不应输出任何其他值   空白。默认值为no。 xml输出方法应该使用   一种算法输出额外的空格,以确保   结果如果使用空格从输出中删除空格   [3.4 Whitespace Stripping]中描述的过程与   只包含xsl:text的空白保留元素   输出附加空格时的输出与添加空格时相同   不输出空格。

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

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

但你还没有说过为什么这条新线对你来说如此重要。您描述的不是将其作为问题&#34;,但为什么会出现问题?如果使用标准XML解析器解析生成的文档,则此时的任何换行都将被忽略。有一种情况会产生影响,即如果您生成的XML被用作包含在某个较大文档中的外部解析实体。但是对于那种情况你绝对不想要换行(这也许是Xalan没有输出它的原因)。

注意:另请参阅Remove space in between doctype in XML using XSLT,这次用户抱怨序列化输出中的换行符,在这种情况下不需要。如果您关心同一文档的替代序列化之间的差异,这不会影响任何符合条件的解析器处理文档的方式,那么(a)您可能不得不编写自己的序列化程序,( b)你将失去XML的一个主要好处,即许多符合要求的工具的可用性,以及(c)你做错了什么:可能使用不符合要求的解析器​​(或者没有完全解析器)来处理生成的XML。

答案 1 :(得分:0)

对我来说,它使用缩进和XML standalone="yes"

transformer.setOutputProperty(OutputKeys.STANDALONE, "yes")

但是,当然,这需要您的客户端或应用程序容忍独立声明。