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

新手上路,请多包涵

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

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

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

所以,归结起来,问题是:

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

原文由 Mike Deck 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 608
2 个回答

听起来像是 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
  }
}

原文由 Tom 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

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

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

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

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

原文由 Archimedes Trajano 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题