我正在使用JDom 2.0.5来修改xml。我还有一个Junit测试用例,检查它是否被正确修改。它有一个输入xml,一个测试方法(转换xml)和一个新的xml(结果)。稍后它会将输出与应该是最终结果的文件进行比较。
FileUtils.contentEquals(newXml, modelXml);
但这总是错误的,因为JDom会自动修改每个结束标记。我无法更改模型,因为这是一项无法修改的要求。
Input: <properties/>
Output: <properties /> --> should be as input:: <properties/>
如何避免JDom更改此标记?
SAXBuilder builder = new SAXBuilder();
Document doc = (Document) builder.build(xmlFile);
// Add, remove some elements ...
XMLOutputter xmlOutput = new XMLOutputter();
xmlOutput.setFormat(Format.getPrettyFormat());
xmlOutput.output(doc, new FileWriter(newXml, false));
答案 0 :(得分:0)
这里的“改变”实际上是完全有效的。额外的空间对XML的含义没有任何影响。
(换句话说,JDom数据结构不会对源代码中存在的非重要空白进行编码。因此,JDom在格式化输出XML时无法重现输入XML的空白区域。 )
真正的问题是您的期望不正确。您根本无法可靠地比较XML文档,就像它们是字符序列一样。
阅读此Q&amp; A了解各种正确的方法来比较Java中的XML:
答案 1 :(得分:0)
也许有人会需要它。
要消除在结束的“ />”标记之前的多余空间,只需在其继承的printElement()
类中重写AbstractXMLOutputProcessor
方法即可。
例如:
public class MyXMLProcessor extends AbstractXMLOutputProcessor {
protected void printElement(...) {
...
// replace in two places:
write(out, "/>");
...
}
}
然后:
XMLOutputter xmlOutput = new XMLOutputter(new MyXMLProcessor());