2010-05-27 13 views
12

यदि मैं XMlDocument की सामग्री की तुलना करना चाहता हूं, तो क्या यह ऐसा ही है?समानता के लिए XmlDocument की तुलना करना (सामग्री के अनुसार)

XmlDocument doc1 = GetDoc1(); 
XmlDocument doc2 = GetDoc2(); 

if(doc1 == doc2) 
{ 

} 

मैं जाँच कर रहा हूँ नहीं करता है, तो वे दोनों एक ही वस्तु संदर्भ रहे हैं, लेकिन अगर एक्सएमएल की सामग्री को एक ही हैं। जो अपने उदाहरण में असफल हो जायेगी, जब तक कि दस्तावेजों वास्तव में एक ही वस्तु उदाहरण हैं -

उत्तर

10

सं XmlDocument Equals() विधि हां, तो यह तथ्य सिर्फ संदर्भ समानता प्रदर्शन में है के व्यवहार हावी नहीं होता।

यदि आप किसी दस्तावेज़ के सामग्रियों (विशेषताओं, तत्वों, कार्यों, पीआई, आदि) की तुलना करना चाहते हैं तो आपको उस तर्क को स्वयं लागू करना होगा।चेतावनी दी: यह मामूली नहीं है।

अपने सटीक परिदृश्य के आधार पर, आप दस्तावेज़ से सभी गैर-आवश्यक व्हाइटस्पेस को हटा सकते हैं (जो स्वयं मुश्किल हो सकता है) और वे परिणामस्वरूप XML पाठ की तुलना करते हैं। यह सही नहीं है - यह उन दस्तावेजों के लिए विफल रहता है जो अर्थात् समान हैं, लेकिन नामों का उपयोग कैसे किया जाता है और घोषित किया जाता है, या कुछ मूल्यों से बच निकले हैं या नहीं, तत्वों का क्रम, आदि। जैसा कि मैंने पहले कहा था, एक्सएमएल तुलना तुच्छ नहीं है।

आपको स्पष्ट रूप से परिभाषित करने की आवश्यकता है कि दो एक्सएमएल दस्तावेज़ों के लिए इसका अर्थ क्या है "समान" होना। क्या तत्व या विशेषता आदेश देने का मामला है? क्या मामला (पाठ नोड्स में) मायने रखता है? क्या आपको अनावश्यक सीडीएटीए अनुभागों को अनदेखा करना चाहिए? प्रसंस्करण निर्देश गिनती है? आंशिक रूप से योग्य नामस्थान बनाम पूरी तरह से योग्यता के बारे में क्या?

किसी भी सामान्य उद्देश्य कार्यान्वयन में, आप संभवतः दोनों दस्तावेजों को कुछ कैनोलिक रूप में बदलना चाहते हैं (चाहे यह एक्सएमएल या कुछ अन्य प्रतिनिधित्व हो) और फिर कैनोलिकीकृत सामग्री की तुलना करें।

उपकरण पहले से ही मौजूद है कि XML differencing करते हैं, Microsoft XML Diff/Patch, आप लाभ उठाने के लिए है कि दो दस्तावेज़ों के बीच मतभेद की पहचान करने में सक्षम हो सकता है। मेरे ज्ञान के लिए कि उपकरण स्रोत रूप में वितरित नहीं किया गया है ... इसलिए इसे एक एम्बेडेड एप्लिकेशन में उपयोग करने के लिए आपको प्रक्रिया को स्क्रिप्ट करने की आवश्यकता होगी (यदि आप इसका उपयोग करने की योजना बना रहे हैं, तो आपको पहले यह सत्यापित करना चाहिए कि लाइसेंसिंग शब्द इसका उपयोग और पुनर्वितरण की अनुमति देते हैं)।

संपादित करें:चेक बाहर @Max Toro's answer आप, .NET 3.5 एसपी 1 उपयोग कर रहे हैं जाहिरा तौर पर XLinq में एक विकल्प है कि सहायक हो सकता है वहाँ के रूप में। यह जानना अच्छा है कि यह मौजूद है।

0

एलबुशकिन सही है, यह मामूली नहीं है। चूंकि एक्सएमएल स्ट्रिंग डेटा है, इसलिए आप तकनीकी रूप से सामग्री का हैश कर सकते हैं और उनकी तुलना कर सकते हैं, लेकिन यह व्हाइटस्पेस जैसी चीजों से प्रभावित होगा।

आप दो दस्तावेजों के बीच एक संरचित diff (जिसे 'XML diffgram' भी कहा जाता है) निष्पादित कर सकते हैं और परिणामों की तुलना कर सकते हैं। इस प्रकार .NET डेटासेट परिवर्तनों का ट्रैक रखता है, उदाहरण के लिए।

इसके अलावा आपको डीओएम के माध्यम से पुनरावृत्ति करना होगा और तत्वों, विशेषताओं और मूल्यों को एक-दूसरे से तुलना करना होगा। यदि कोई स्कीमा शामिल है तो आपको खाता स्थिति भी लेनी होगी और इसी तरह।

31

XLinq API पर DeepEquals विधि आज़माएं।

XDocument doc1 = GetDoc1(); 
XDocument doc2 = GetDoc2(); 

if(XNode.DeepEquals(doc1, doc2)) 
{ 

} 

भी देखें Equality Semantics of LINQ to XML Trees

+0

इसके बारे में नहीं पता था, धन्यवाद। –

+0

बहुत अच्छा। मुझे यह अस्तित्व में नहीं पता था। ऐसा लगता है कि यह कई मामलों को संभालता है जो मैं वर्णन करता हूं। – LBushkin

+0

नाइस - इसका मतलब है कि मुझे यह करने के लिए एक तीसरी पार्टी लाइब्रेरी आयात करने की आवश्यकता नहीं थी! –

8

एक आसान तरीका OuterXml तुलना करने के लिए हो सकता है।

var a = new XmlDocument(); 
var b = new XmlDocument(); 

a.LoadXml("<root foo='bar' />"); 
b.LoadXml("<root foo='bar'/>"); 

Debug.Assert(a.OuterXml == b.OuterXml);