2009-09-15 18 views
11

जाहिर है मैं उनके पार्स के पेड़ों की तुलना (क) canonical XML या (ख) के लिए दोनों तार बदलना होगा। निम्नलिखित काम नहीं करते हैं क्योंकि दस्तावेज़ ऑब्जेक्ट लौटा एक समझदार == परिभाषित नहीं है। क्योंकि Nokogiri के to_xml कुछ आंतरिक खाली स्थान के पत्तेमैं रुबी में एक्सएमएल समानता का परीक्षण कैसे करूं?

Nokogiri.XML(doc_a) == Nokogiri.XML(doc_b) 

न ही, निम्नलिखित है:

Nokogiri.XML(doc_a).to_xml == Nokogiri.XML(doc_b).to_xml 

यह समानता का एक उचित अनुमान होता है (और ज्यादातर मामलों के लिए काम करेंगे), लेकिन यह बहुत सही नहीं है:

Nokogiri.XML(doc_a).to_xml.squeeze(' ') == Nokogiri.XML(doc_b).to_xml.squeeze(' ') 

मैं पहले से ही नोकोगिरी का उपयोग कर रहा हूं, इसलिए मैं इसके साथ रहना पसंद करूंगा, लेकिन मैं लाइब्रेरी के कामों का उपयोग करूंगा।

+2

मैं इसे एक अच्छा जवाब देखना चाहता हूं। AFAIK, कैनोनिकल एक्सएमएल इस पल में आपका एकमात्र विकल्प है। – Swanand

+0

संभावित डुप्लिकेट [diff एक रूबी स्ट्रिंग या सरणी] (http://stackoverflow.com/questions/80091/diff-a-ruby-string-or-array) – sawa

उत्तर

4

यदि आप संरचनात्मक समानता की तलाश में हैं और टैग और विशेषताओं के क्रम की परवाह नहीं करते हैं, तो शायद xml-simple लाइब्रेरी एक अच्छी पसंद है।यह एक्सएमएल को रूबी के डेटा स्ट्रक्चर (हैश और सूचियों) में परिवर्तित करता है जिसे == ऑपरेटर से सुरक्षित रूप से तुलना किया जा सकता है।

1

उन्हें तार में कनवर्ट कर बहुत सफल नहीं होगा। उदाहरण के लिए, यदि किसी तत्व में दो विशेषताएं हैं, तो क्या आदेश वास्तव में मायने रखता है? ज्यादातर मामलों में, नहीं। क्या किसी दिए गए नोड के बच्चों का आदेश है? निर्भर करता है कि आप क्या कर रहे हैं। लेकिन अगर उन प्रश्नों में से एक का जवाब "नहीं" है, तो एक साधारण स्ट्रिंग तुलना सबसे अच्छा है।

वहाँ Nokogiri में कुछ भी आप के लिए यह करने के लिए नहीं है, आपको इसे स्वयं बनाना होगा। हारून पैटरसन discusses some of the issues here:

जहां तक ​​XML दस्तावेज़ का संबंध है, कोई दो नोड्स कभी बराबर हैं। दस्तावेज़ में प्रत्येक नोड अलग है। प्रत्येक नोड में तुलना करने के लिए गुण हैं:

  1. क्या नाम वही है?
  2. गुणों के बारे में कैसे?
  3. नामस्थान के बारे में कैसे?
  4. बच्चों की संख्या के बारे में क्या?
  5. क्या सभी बच्चे समान हैं?
  6. यह माता पिता के नोड ही है है?
  7. के बारे में क्या यह स्थिति नोड्स भाई रिश्तेदार है?

उसी दस्तावेज़ में दो नोड जोड़ने के बारे में सोचें। वे कभी नोड्स के सापेक्ष समान स्थिति रखते हैं, इसलिए दस्तावेज़ में दो नोड्स "बराबर" नहीं हो सकते हैं।

आप कर सकते हैं हालांकि दो विभिन्न दस्तावेज़ों की तुलना करें। लेकिन आपको के रूप में अपने 7 प्रश्नों का उत्तर देने की आवश्यकता है, आप दो पेड़ चल रहे हैं। समानता के लिए आपकी आवश्यकताएं दूसरों से भिन्न हो सकती हैं।

यह आपकी सबसे अच्छी शर्त है: पेड़ों पर चलें और उन तुलनाओं को करें।

+4

मुझे यकीन है कि कैनोनिकल एक्सएमएल (http: // www.w3.org/TR/xml-c14n) उन सभी सात मुद्दों का ख्याल रखता है। –

11

वास्तव में equivalent-xml या nokogiri-diff समेत एक्सएमएल पेड़ों के समकक्ष की जांच के लिए कुछ अच्छे नोकोगिरी-आधारित पुस्तकालय हैं, जो उपयोगी हो सकते हैं।

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

+0

प्लस कि समकक्ष-एक्सएमएल आरएसपीसी मैचर्स प्रदान करता है। –

संबंधित मुद्दे