java 当属性顺序不同时,使用xmlunit比较XML不起作用

ecfdbz9o  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(124)

我有2个xmls:基本上有两个XSD模式

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="my_export_file">
    <xsd:complexType>
      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="row">
          <xsd:complexType>
            <xsd:attributeGroup ref="rowattr" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attributeGroup ref="docelattr" />
    </xsd:complexType>
  </xsd:element>
  <xsd:attributeGroup name="rowattr">
    <xsd:attribute name="subject_level_ind" type="Str.1" use="optional" />
    **<xsd:attribute name="object_level_ind" type="Str.1" use="optional" />**
    <xsd:attribute name="src_system_id" type="Str.80" use="required" />   
  </xsd:attributeGroup>
  <xsd:attributeGroup name="docelattr">
    <xsd:attribute name="reporting_date" type="xsd:string" />
    <xsd:attribute name="interface_type" type="xsd:string" /> 
  </xsd:attributeGroup>
  <xsd:simpleType name="Str.1">
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="1" />
    </xsd:restriction>
  </xsd:simpleType>
    <xsd:simpleType name="Str.80">
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="80" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

以及

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="my_export_file">
    <xsd:complexType>
      <xsd:sequence minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="row">
          <xsd:complexType>
            <xsd:attributeGroup ref="rowattr" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
      <xsd:attributeGroup ref="docelattr" />
    </xsd:complexType>
  </xsd:element>
  <xsd:attributeGroup name="rowattr">
    <xsd:attribute name="subject_level_ind" type="Str.1" use="optional" />
    <xsd:attribute name="src_system_id" type="Str.80" use="required" />
    **<xsd:attribute name="object_level_ind" type="Str.1" use="optional" />**       
  </xsd:attributeGroup>
  <xsd:attributeGroup name="docelattr">
    <xsd:attribute name="reporting_date" type="xsd:string" />
    <xsd:attribute name="interface_type" type="xsd:string" /> 
  </xsd:attributeGroup>
  <xsd:simpleType name="Str.1">
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="1" />
    </xsd:restriction>
  </xsd:simpleType>
    <xsd:simpleType name="Str.80">
    <xsd:restriction base="xsd:string">
      <xsd:maxLength value="80" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>

我想比较它们并给出不同之处。我的代码工作正常,但唯一的问题是,如果属性的顺序不同,它不会将它们视为"相似"。正如您在示例中看到的,我的xml是相同的,只有一个变化-object_level_ind的顺序不同。我希望我的代码不返回这种差异。

    • 代码**
var fis1 = new FileReader("C:\\Users\\test1.xsd ");
 var fis2 = new FileReader("C:\\Users\\test2.xsd");
 XMLUnit.setIgnoreWhitespace(true);
 XMLUnit.setIgnoreAttributeOrder(true);
 DetailedDiff diff =  new DetailedDiff(XMLUnit.compareXML(fis1,fis2));
 diff.overrideElementQualifier(new ElementNameAndTextQualifier());
 List<?> allDifferences = diff.getAllDifferences();
 System.out.println(allDifferences);

我也尝试过:

DifferenceEvaluator evaluator = DifferenceEvaluators
                .downgradeDifferencesToEqual(ComparisonType.CHILD_NODELIST_SEQUENCE);

        Diff diff = DiffBuilder.compare(fis1)
                .withTest(fis2).ignoreComments()
                .ignoreWhitespace()
                .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
                .withDifferenceEvaluator(evaluator)
                .checkForSimilar()
                .build();
        System.out.println("Differences: " + diff);

我还尝试了comparing two xmls using xmlunit ignorng their order中给出的解决方案
但是对于我的xml,它给出:

identical: false
similar  : false

请让我知道,如果任何指针。
此致,
阿比

iqxoj9l9

iqxoj9l91#

这是因为setIgnoteAttributeOrder忽略了节点/元素的属性顺序,而不是节点/元素在XML文档中的实际顺序,因此,虽然<xsd:attribute name="object_level_ind" type="Str.1" use="optional" /><xsd:attribute use="optional" name="object_level_ind" type="Str.1" />被认为是相同的,但元素的顺序没有被忽略。
此处的答案可能详细说明了如何比较忽略元素顺序-Compare two XML strings ignoring element order

相关问题