如何防止XML Transformer更改行结尾

时间:2013-01-24 06:50:18

标签: java xml dom

我有一个编辑xml文件的方法。该方法的一般概要是:

public void process(Path anXmlFile) {
    try {
        anXmlFile= anXmlFile.normalize();
        log.debug("processing {}",anXmlFile);
        Document dom = buildDOM(anXmlFile.toFile());

        //do stuff with dom...
        //delete original file
        //and finally ...
        dom.normalize(); //so we get a more predictable order

        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT,"yes");
        Source source = new DOMSource(dom);
        Result result = new StreamResult(anXmlFile.toFile());
        transformer.transform(source, result);
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

我的问题是,如果我对某个行打开并在下一行中关闭的xml有多行注释(请注意换行符):

<!-- this is a long comment[cr][lf] 
     that spans 2 lines -->

比我写出修改后的DOM后,结果将是:

<!-- this is a long comment[cr] 
     that spans 2 lines -->
问题是[cr] [lf]变成[cr]。 这是以这种方式受影响的xml的唯一部分。所有其他行结尾都与原始行([cr] [lf])相同 - 即使是那些我修改过的(我的代码也没有改变DOM中的注释节点)。

我可以为我创建的Transformer提供任何配置选项以避免这种情况吗? 这都是使用JDK类完成的,不涉及xml库。

1 个答案:

答案 0 :(得分:1)

XML规范要求XML处理器(解析器)用\r\n替换\r\n。因此,如果您检查DOM文本节点,您将看到只有\n作为行结尾。

在序列化DOM树时,大多数实现在编写字符数据中出现的换行符时使用平台默认值,或者它们为您提供了显式设置行尾字符串的选项。但是,评论文本不是字符数据;这些字符只是在没有任何其他处理的情况下编写。至少,这是大多数序列化程序的行为方式。

如果它非常重要,您可以切换到JDOM并扩展AbstractXMLOutputProcessor以更改写入注释的方式。