如何控制javax.xml.transform.Transformer创建的行结尾?

时间:2017-03-03 13:43:12

标签: java xml dom

我正在使用

将DOM文档(org.w3c.dom.Document)转换为Stream
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, UTF_8.name());
ByteArrayOutputStream out = new ByteArrayOutputStream();
StreamResult output = new StreamResult(out);
Source input = new DOMSource(document);
transformer.transform(input, output);

该文档包含带换行符的文本节点(' \ n')。在输出中他们 被替换为CRLF(" \ r \ n"),这是不希望的。有没有办法控制这个(当然,除了之后更换它们)?

我无法控制文档DTD( - > XML空白处理)。

(备注:OutputKeys.INDENT不是正确答案。)

备注:为什么这个问题与question 19102804 (Ensure Unix-style line endings)不同:

  • 这个问题明确提到了javax.xml.transform.Transformer以及影响其对行结尾处理的可能性。问题19102804要求任何解决方案,不仅仅是使用javax.xml.transform.Transformer的解决方案。

  • 问题19102804仅限于获取" Unix风格的行结尾"。在我的情况下,理想的解决方案是一个组件,它只是按原样放出DOM模型实例,而不是触及任何节点(到目前为止所做的一切)。

  • 不能更改line.separator系统属性(请参阅注释)。

2 个答案:

答案 0 :(得分:3)

如果要做的只是序列化DOM节点,那么在Java世界中,您可以使用LSSerializerhttps://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/LSSerializer.html)而不是默认Transformer然后使用方法{ {1}}(https://docs.oracle.com/javase/7/docs/api/org/w3c/dom/ls/LSSerializer.html#setNewLine(java.lang.String))定义或控制您的首选行结尾。

答案 1 :(得分:0)

基于Martin Honnens的工作解决方案回答。 (但这并不完全是问题的答案,这个问题明确地指的是变形金刚。所以可能正确的答案是"没有。",但我暂时保持开放状态。):

final DOMImplementationLS dom =
  (DOMImplementationLS) DOMImplementationRegistry.newInstance().getDOMImplementation("LS")
;
final LSSerializer serializer = dom.createLSSerializer();
serializer.setNewLine("\n");
final LSOutput destination = dom.createLSOutput();
destination.setEncoding(UTF_8.name());
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
destination.setByteStream(bos);
serializer.write(document, destination);

Transformer和LSSerializer之间的一个区别是Transformer写入

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

在没有插入空格之后,LSSerializer写入

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

并在。之后插入换行符。