【问题标题】:Remove whitespaces in end tags jdom删除结束标签 jdom 中的空格
【发布时间】:2026-01-09 07:45:01
【问题描述】:

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

【问题讨论】:

    标签: java xml jdom jdom-2


    【解决方案1】:

    也许有人会需要它。 要消除关闭“/>”标签之前的多余空间,只需覆盖其继承的AbstractXMLOutputProcessor 类中的printElement() 方法即可。 例如:

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

    然后:

    XMLOutputter xmlOutput = new XMLOutputter(new MyXMLProcessor());
    

    【讨论】:

      【解决方案2】:

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

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


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

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

      【讨论】:

      • 它们都是有效且“相等”的 xml,但您可以在 git commit 中看到额外的差异,或者它可以强制启动一些脚本,因为文件不同