2009-08-06 19 views
27

मैं बहुत की तरह एक एक्सएमएल संदेश है:XML की तुलना करते समय मैं कुछ तत्वों को कैसे अनदेखा कर सकता हूं?

<root> 
    <elementA>something</elementA> 
    <elementB>something else</elementB> 
    <elementC>yet another thing</elementC> 
</root> 

मैं इस प्रकार की एक उम्मीद संदेश के लिए परीक्षण के अंतर्गत एक विधि द्वारा उत्पादित की संदेश की तुलना करना चाहते हैं, लेकिन मैं elementA के बारे में परवाह नहीं है। तो, मैं चाहूँगा उपरोक्त संदेश के बराबर पर विचार किया जाएगा:

<root> 
    <elementA>something different</elementA> 
    <elementB>something else</elementB> 
    <elementC>yet another thing</elementC> 
</root> 

मैं XMLUnit नवीनतम संस्करण का उपयोग कर रहा हूँ।

मैं कल्पना कर रहा हूं कि उत्तर में एक कस्टम DifferenceListener बनाना शामिल है; अगर वहां कुछ उपयोग करने के लिए तैयार है तो मैं सिर्फ पहिया को फिर से शुरू नहीं करना चाहता हूं।

XMLUnit के अलावा अन्य लाइब्रेरी का उपयोग करने वाले सुझावों का स्वागत है।

उत्तर

10

हालात XMLUnit के लिए बहुत कुछ बदल गया है के बाद से इस सवाल का जवाब था:

8

मैं एक्सएसएलटी और identity transform का उपयोग उन तत्वों को फ़िल्टर करने के लिए करता हूं जिन्हें मैं अनदेखा करना चाहता हूं, और परिणामों की तुलना करें।

एसओ पर पहले XSL: how to copy a tree, but removing some nodes ? देखें।

public class IgnoreNamedElementsDifferenceListener implements DifferenceListener { 
    private Set<String> blackList = new HashSet<String>(); 

    public IgnoreNamedElementsDifferenceListener(String ... elementNames) { 
     for (String name : elementNames) { 
      blackList.add(name); 
     } 
    } 

    public int differenceFound(Difference difference) { 
     if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) { 
      if (blackList.contains(difference.getControlNodeDetail().getNode().getParentNode().getNodeName())) { 
       return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
      } 
     } 

     return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
    } 

    public void skippedComparison(Node node, Node node1) { 

    } 
} 
+0

यह समस्या के लिए एक मान्य दृष्टिकोण भी है। सलाह के लिये धन्यवाद। –

38

मैं के लिए शाब्दिक मतभेद की अनदेखी करने के एक DifferenceListener कि (नामस्थान के साथ) नोड नामों की एक सूची लेता है को लागू करने को समाप्त।

जब एक DiffBuilder का उपयोग कर अब आप आसानी से एक नोड अनदेखा कर सकते हैं:

final Diff documentDiff = DiffBuilder 
      .compare(expectedSource) 
      .withTest(actualSource) 
      .withNodeFilter(node -> !node.getNodeName().equals(someName)) 
      .build(); 

आप तो documentDiff.hasDifferences() नोड्स को कॉल करते हैं फिल्टर करने के लिए नजरअंदाज कर दिया जाएगा जोड़ा।

+13

मुझे आश्चर्य है कि यह जटिल है - निराशाजनक अगर xmlunit में विशिष्ट तत्वों को अनदेखा करने के लिए कुछ नहीं बनाया गया है? – bacar

+0

यह समाधान अब काफी पुराना है। स्पष्ट रूप से नया xmlunit प्रोग्रामिंग मॉडल [ComparisonListener] का उपयोग करता है (http://www.xmlunit.org/api/java/2.4.0/org/xmlunit/diff/ComparisonListener.html), अंतरसूची नहीं। – Cheeso

-1

सार्वजनिक वर्ग IgnoreNamedElementsDifferenceListener लागू करता है InterListener { निजी सेट ब्लैकलिस्ट = नया हैशसेट();

public IgnoreNamedElementsDifferenceListener(String ... elementNames) { 
    for (String name : elementNames) { 
     blackList.add(name); 
    } 
} 

public int differenceFound(Difference difference) { 
    if (difference.getId() == DifferenceConstants.TEXT_VALUE_ID) { 
     if (blackList.contains(difference.getControlNodeDetail().getNode().getParentNode().getNodeName())) { 
      return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
     } 
    } 

    return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
} 

public void skippedComparison(Node node, Node node1) { 

} 

}

कैसे मेरी विधि को यह खुद कार्यान्वयन तुलना के लिए नजरअंदाज कर दिया विशिष्ट नोड के बाद मतभेद देखने के लिए आह्वान करने के लिए।?

+0

ऐसा लगता है कि आप एक उत्तर के रूप में एक नया सवाल पूछ रहे हैं। यदि आपके पास कोई नया प्रश्न है, तो इसे एक प्रश्न के रूप में पूछें, मौजूदा प्रश्न के उत्तर के रूप में नहीं। – Cheeso