我有一个编辑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);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我对某个行打开并在后续行中关闭的xml有多行注释(请注意换行符):
<!-- this is a long comment[cr][lf]
that spans 2 lines -->
Run Code Online (Sandbox Code Playgroud)
在我写出修改后的DOM之后,结果将是:
<!-- this is a long comment[cr]
that spans 2 lines -->
Run Code Online (Sandbox Code Playgroud)
问题是[cr] [lf]变成[cr].这是以这种方式受影响的xml的唯一部分.所有其他行结尾与原始行([cr] [lf])相同 - 即使是那些我修改过的(我的代码也没有改变DOM中的注释节点).
我可以为我创建的Transformer提供任何配置选项以避免这种情况吗?这都是使用JDK类完成的,不涉及xml库.
XML 规范要求 XML 处理器(解析器)替换\r\n或仅 \r使用单个\n. 因此,如果您检查 DOM 文本节点,您会发现只有\nas 行结尾。
序列化 DOM 树时,大多数实现在写入字符数据中出现的换行符时使用平台默认值,或者它们为您提供显式设置行尾字符串的选项。然而,评论文本不是字符数据;字符只是按原样写入,没有任何其他处理。至少,这是大多数序列化器的行为方式。
如果它非常重要,您可以切换到 JDOM 并扩展 AbstractXMLOutputProcessor 来更改注释的编写方式。
| 归档时间: |
|
| 查看次数: |
2037 次 |
| 最近记录: |