0

我正在使用 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));
4

2 回答 2

1

也许有人会需要它。为了摆脱关闭“/>”标签之前的额外空间,覆盖printElement()其继承AbstractXMLOutputProcessor类中的方法就足够了。例如:

public class MyXMLProcessor extends AbstractXMLOutputProcessor {
    protected void printElement(...) {
        ...
        // replace in two places:
        write(out, "/>");
        ...
    }
}

接着:

XMLOutputter xmlOutput = new XMLOutputter(new MyXMLProcessor());
于 2020-11-24T18:37:44.987 回答
-1

这里的“改变”实际上是完全有效的。额外的空间对 XML 的含义没有影响。

(或者换句话说,JDom 数据结构不会对源标记中是否存在非重要空白进行编码。因此,JDom 在格式化输出 XML 时无法再现输入 XML 的空白。)


真正的问题是你的期望是不正确的。您根本无法可靠地比较 XML 文档,就好像它们是字符序列一样。

阅读此问答,了解在 Java 中比较 XML的各种正确方法:

于 2014-07-21T09:28:18.737 回答