7

我有一个编辑 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 库。

4

1 回答 1

3

XML 规范要求 XML 处理器(解析器)替换\r\n或仅 \r使用单个\n. 所以如果你检查你的 DOM 文本节点,你会发现你只有\n作为行尾。

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

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

于 2013-01-24T09:45:48.577 回答