我有一个编辑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库。
答案 0 :(得分:1)
XML规范要求XML处理器(解析器)用\r\n
替换\r
或\n
。因此,如果您检查DOM文本节点,您将看到只有\n
作为行结尾。
在序列化DOM树时,大多数实现在编写字符数据中出现的换行符时使用平台默认值,或者它们为您提供了显式设置行尾字符串的选项。但是,评论文本不是字符数据;这些字符只是在没有任何其他处理的情况下编写。至少,这是大多数序列化程序的行为方式。
如果它非常重要,您可以切换到JDOM并扩展AbstractXMLOutputProcessor以更改写入注释的方式。