1

我有两个类似的 xml 字符串。我使用 XMLUnit 来比较它们,但是在我运行一些示例测试来检查它们之后,它说它们并不相似和相同。我同意它们不相同,但我认为它应该为相似返回 true。下面是我运行的字符串和测试代码。

<Errors>
  <Error>
    <Sheet>Sample1</Sheet>
    <ErrorCode>4</ErrorCode>
    <Columns>
      <Column>Id</Column>
      <Column>Name</Column>
    </Columns>
  </Error>
  <Error>
    <Sheet>Sample2</Sheet>
    <ErrorCode>4</ErrorCode>
    <Columns>
      <Column>Id</Column>
      <Column>Name</Column>
    </Columns>
  </Error>
</Errors>

<Errors>
  <Error>
    <Sheet>Sample1</Sheet>
    <ErrorCode>4</ErrorCode>
    <Columns>  
      <Column>Name</Column>
      <Column>Id</Column>
    </Columns>
  </Error>
  <Error>
    <Sheet>Sample2</Sheet>
    <ErrorCode>4</ErrorCode>
    <Columns>
      <Column>Name</Column>
      <Column>Id</Column>
    </Columns>
  </Error>
</Errors>

唯一的区别是 Column 节点是相反的,但我认为它应该返回两个字符串是相似的。

public void test() throws Exception{
    String myControlXML = "here goes xml1";
    String myTestXML = "here goes xml2";
    Diff myDiff = new Diff(myControlXML, myTestXML);

    System.out.println("pieces of XML are similar " +  myDiff.similar());
    System.out.println("but are they identical? " + myDiff.identical());
}
4

1 回答 1

2

只是猜测,但我认为问题在于两个标签具有相同的名称。这听起来很矛盾,但让我解释一下:

<root>
    <field>John</field>
    <field>Smith</field>
</root>

<root>
    <field>Smith</field>
    <field>John</field>
</root>

对我来说,这两段 XML 并不像John Smith所说的和另一段Smith John所说的那样相似

<person>
    <name>John</name>
    <surname>Smith</surname>
<person>
<person>
    <name>John</name>
    <surname>Smith</surname>
<person>

这些其他人是相似的:不完全相同,但显然都说约翰史密斯

换句话说:正如@JustinKSU 所说,订单很重要。

更新:来自XMLUnit Java 用户指南如果两个 XML 之间没有差异,则它们是相同的;如果它们之间只有可恢复的差异,则它们是相似的;如果它们之间存在任何不可恢复的差异,则它们是不同的

我的第二个示例显示了两个相似的 XML 片段,因为差异是可以恢复的。第一个不是因为我们不知道正确的顺序:也许有一个人叫史密斯,所以我们不能确定。您的示例几乎是相同的情况:解析器无法知道列顺序是否重要。想象一下,您的 XML 用于选择如何排序 SQL 查询:

SELECT * FROM table order by name, id显然不一样SELECT * FROM table order by id, name

于 2014-03-11T16:18:19.267 回答