有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Doc4j:由于元素类型不同,比较两个文档失败

我试图为我编写的Docx4J生成器编写一些JUnit测试。 我想将生成器的输出节点与希望从字符串加载的预期节点进行比较

因此,我创建“实际”节点(生成器输出),如下所示:

Node xmlNodeActual = XmlUtils.marshaltoW3CDomDocument(actual).getDocumentElement();

其中“实际”是由生成器创建的对象

对于我的“预期”节点,我编写了以下代码:

Document doc = docBuilder.parse(new InputSource(new ByteArrayInputStream(strXmlNode.getBytes("utf-8")))):
Node xmlNodeExpected = doc.getDocumentElement();

strXmlNode是一个包含所需xml的字符串。 虽然我的两个节点从视觉差异上看是相等的,但调用以下命令会产生“false”结果:

xmlNodeActual.isEqualNode(xmlNodeExpected)

我怀疑原因是这两个节点的运行时类型不同:

  • xmlNodeActual:org。阿帕奇。薛西斯。多姆。推迟实施
  • xmlNodeExpected:org。阿帕奇。薛西斯。多姆。ElementsImpl

我喜欢我的测试设计,因为它允许我为一个大型生成器快速编写大量测试用例。然而,我看不到将这种方法与“isEqualNode”结合使用的方法。 我是否必须编写自己的比较器,或者是否有一种我不知道的方法来确保节点的类型相同


共 (1) 个答案

  1. # 1 楼答案

    使用这种方法的一个问题是,它只给出了一个布尔值的答案,而没有告诉您这两个节点之间的实际差异是什么。另一个问题是,你不能告诉你你认为重要的区别:例如(就我所见),冗余命名空间声明被这个特定方法认为是重要的。空白通常是有问题的。我在使用XPath deep-equal()方法时遇到了同样的问题,因此编写了saxon:deep-equal变量。但我现在更喜欢使用一组XPath断言来测试预期结果。W3C XSLT测试套件将此技术用于以下测试断言:

    <result>
         <all-of>
            <assert>/root/p[1]/text()[1] = 'Tekst '</assert>
            <assert>/root/p[1]/text()[2] = ' etc..'</assert>
            <assert>/root/p[2]/text()[1] = 'Tekst '</assert>
            <assert>/root/p[2]/text()[2] = ' etc..'</assert>
         </all-of>
      </result>
    

    我曾经有一个小工具,可以从XML文档生成这样一个断言列表,但现在我倾向于手动执行。最大的优点是,如果出现问题,诊断将告诉您哪个断言失败