在Java中比较2个XML文档的最佳方法

2022-08-31 06:01:29

我正在尝试编写一个应用程序的自动测试,该应用程序基本上将自定义消息格式转换为XML消息并将其发送到另一端。我有一组很好的输入/输出消息对,所以我需要做的就是发送输入消息并侦听XML消息从另一端出来。

当需要将实际输出与预期输出进行比较时,我遇到了一些问题。我的第一个想法只是对预期和实际消息进行字符串比较。这不能很好地工作,因为我们拥有的示例数据并不总是格式一致,并且通常有不同的别名用于XML命名空间(有时根本不使用命名空间)。

我知道我可以解析这两个字符串,然后遍历每个元素并自己比较它们,这并不难做到,但我感觉有更好的方法或可以利用的库。

所以,归根结底,问题是:

给定两个 Java 字符串,它们都包含有效的 XML,您将如何确定它们在语义上是否等效?奖励积分,如果你有办法确定差异是什么。


答案 1

听起来像是 XMLUnit 的工作

例:

public class SomeTest extends XMLTestCase {
  @Test
  public void test() {
    String xml1 = ...
    String xml2 = ...

    XMLUnit.setIgnoreWhitespace(true); // ignore whitespace differences

    // can also compare xml Documents, InputSources, Readers, Diffs
    assertXMLEqual(xml1, xml2);  // assertXMLEquals comes from XMLTestCase
  }
}

答案 2

下面将使用标准 JDK 库检查文档是否相等。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setCoalescing(true);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setIgnoringComments(true);
DocumentBuilder db = dbf.newDocumentBuilder();

Document doc1 = db.parse(new File("file1.xml"));
doc1.normalizeDocument();

Document doc2 = db.parse(new File("file2.xml"));
doc2.normalizeDocument();

Assert.assertTrue(doc1.isEqualNode(doc2));

normalize() 是为了确保没有周期(从技术上讲不会有任何循环)

上面的代码将要求元素中的空格相同,因为它会保留并计算它。Java附带的标准XML解析器不允许您设置功能以提供规范版本或了解这是否会成为问题,那么您可能需要一个替代的XML解析器,例如xerces或使用JDOM。xml:space


推荐