要编写我的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>
怎么做?
答案 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")
但是,当然,这需要您的客户端或应用程序容忍独立声明。