2011-07-05 23 views
6

Tôi đang cố gắng thành công XmlUnit và rất hữu ích trong công việc của tôi. Bây giờ, tôi có một vấn đề nhỏ, rằng tôi không biết làm thế nào để giải quyết. Tôi có một lớp java, có một Set và khi chuyển đổi nó thành XML, các phần tử bên trong có thể có bất kỳ thứ tự nào.So sánh các tệp xml tương tự với XmlUnit với các thẻ không có thứ tự (cùng một tên thẻ với các thuộc tính khác nhau)

Khi tôi cố gắng hai tập tin này trong XmlUnit nó hoạt động (Diff nói rằng họ là tương tự):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
    </AvailableMeasures> 
</Monitor> 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
     <MeasureDescriptorA name="netInput_mynetwork"></MeasureDescriptorA> 
    </AvailableMeasures> 
</Monitor> 

Nhưng khi các thẻ có cùng tên (với các thuộc tính khác nhau) nó không làm việc (nó trộn lẫn các thuộc tính, và hy vọng một trong thẻ khác):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
     <MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor> 
    </AvailableMeasures> 
</Monitor> 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Monitor> 
    <AvailableMeasures> 
     <MeasureDescriptor name="netInput_mynetwork"></MeasureDescriptor> 
     <MeasureDescriptor name="netInput_myothernetwork"></MeasureDescriptor> 
    </AvailableMeasures> 
</Monitor> 

có workaround?

+0

Tôi tìm thấy giải pháp của bản thân mình, với đoạn mã này: \t \t Diff diff = new Diff (controlXml, responseXML); \t \t diff.overrideElementQualifier (new ElementNameAndAttributeQualifier()); hoàn thành;) – greuze

+0

bạn có thể tự mình đăng câu trả lời cho câu hỏi và sau đó chấp nhận câu trả lời đó không? Ngoài ra, bạn cần chấp nhận câu trả lời cho các câu hỏi trước nếu chúng khắc phục được sự cố của bạn. – Zecas

+0

Ok, tôi nghĩ mình không thể trả lời câu hỏi của mình. Bây giờ tôi sẽ tự trả lời. – greuze

Trả lời

6

Tôi đã tự tìm ra giải pháp.

Diff diff = new Diff(controlXml, responseXml); 
diff.overrideElementQualifier(new ElementNameAndAttributeQualifier()); 
+0

Điều này sẽ được thực hiện như thế nào trong XmlUnit 2.0? – lanoxx

0

Trên giải pháp duy nhất làm việc với các thuộc tính đặt hàng nhưng nó sẽ không hoạt động nếu bạn có vấn đề với cùng để loại yếu tố như dưới đây:

<CustomerDataSet> 
     <CustomerData> 
      <Key>ACCOUNT_TYPE</Key> 
      <Value>GREEN</Value> 
     </CustomerData> 
     <CustomerData name = "bla"> 
      <Key>EMAIL_ADDRESS</Key> 
      <Value>[email protected]</Value> 
     </CustomerData> 
     <CustomerData> 
      <Key>DATE_OF_BRITH</Key> 
      <Value>01-01-1976</Value> 
     </CustomerData> 
    </CustomerDataSet> 

      <CustomerDataSet> 
     <CustomerData name = "bla"> 
      <Key>EMAIL_ADDRESS</Key> 
      <Value>[email protected]</Value> 
     </CustomerData> 
     <CustomerData> 
      <Key>ACCOUNT_TYPE</Key> 
      <Value>GREEN</Value> 
     </CustomerData> 
     <CustomerData> 
      <Key>DATE_OF_BRITH</Key> 
      <Value>01-01-1976</Value> 
     </CustomerData> 
    </CustomerDataSet> 

Tuy nhiên, bạn có thể làm việc này bằng cách sử dụng RecursiveElementNameAndTextQualifier thay .

3

Điều này dường như làm việc cho XMLUnit 2.0:

Diff myDiff = DiffBuilder.compare(Input.fromString(expected)) 
      .withTest(Input.fromString(actual)) 
      .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndAllAttributes)) 
      .checkForSimilar() 
      .build(); 
Các vấn đề liên quan