代码之家  ›  专栏  ›  技术社区  ›  Robert Walter

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

  •  0
  • Robert Walter  · 技术社区  · 8 年前

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

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

    其中“actual”是由生成器创建的对象。

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

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

    strXmlNode是一个包含预期xml的字符串。

    xmlNodeActual.isEqualNode(xmlNodeExpected)
    

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

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

    3 回复  |  直到 8 年前
        1
  •  0
  •   Michael Kay    8 年前

    使用这种方法的一个问题是,它只给出了一个布尔答案,而没有告诉您两个节点之间的实际差异是什么。另一个问题是,您无法告诉它您认为重要的差异:例如(据我所见),冗余命名空间声明被这个特定方法认为是重要的。空白通常是有问题的。我在使用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>
    

        3
  •  0
  •   Robert Walter    8 年前

    至于我的具体问题,也就是说,将两个XML节点与“isEqualNode”进行简单比较,一个来自输入字符串,一个来自数据转换,我必须做以下工作:我不需要解析字符串,而是可以通过InputStream对其解组,从而获得所需的节点类型。

    // creating the "actual" node I want to test (nothing changed here)
    Node xmlNodeActual = XmlUtils.marshaltoW3CDomDocument(actual).getDocumentElement();
    
    //...
    
    // Instead of parsing the string, just unmarshal and marshal it once
    Object expected = XmlUtils.unmarshal(new ByteArrayInputStream(strXmlNode.getBytes("utf-8")));
    Node xmlNodeExpected = XmlUtils.marshaltoW3CDomDocument(expected).getDocumentElement();
    if(!xmlNodeActual.isEqualNode(xmlNodeExpected)) {
    // ...
    }
    

    这会产生相同的节点类型,并按预期适用于我的设置。尽管如此,正如Michael Kay所指出的那样,这种比较两个XML树的方法存在一些缺陷,因此不要认为这是一种最佳实践,而应该求助于另一种答案来进行一般的XML比较。

    推荐文章