मैं दो एक्सएमएल फाइलें कैसे अलग कर सकता हूं?


74

लिनक्स पर, मैं दो XML फ़ाइलों के बीच अंतर कैसे उत्पन्न कर सकता हूं?

आदर्श रूप में, मैं इसे कुछ चीजों के लिए कॉन्फ़िगर करने में सक्षम होना चाहूंगा, या कुछ चीजों को ढीला कर सकता हूं, जैसे कि व्हाट्सएप, या विशेषता क्रम।

मैं अक्सर ध्यान रखूंगा कि फाइलें कार्यात्मक रूप से समान हैं, लेकिन खुद से अलग हैं, उपयोग करने के लिए कष्टप्रद होगा, खासकर अगर XML फ़ाइल में बहुत अधिक लाइनब्रेक नहीं हैं।

उदाहरण के लिए, निम्नलिखित मेरे लिए ठीक होना चाहिए:

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>

जवाबों:


85

एक दृष्टिकोण यह होगा कि पहले दोनों XML फाइलों को Canonical XML में बदल दिया जाए , और उपयोग करने वाले परिणामों की तुलना करें diff। उदाहरण के लिए, xmllint का उपयोग XML को canonicalize करने के लिए किया जा सकता है।

$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml

या वन-लाइनर के रूप में।

$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)

1
Xmllint में --c14n स्विच के बारे में कभी नहीं पता था। यह आसान है।
रात ०१:०१ तक

18
आप इसे एक पंक्ति में भी कर सकते हैंvimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
नाथन विलासेसा

और OS X के साथ xmllint जहाज
क्लिंटम

10
यदि यह स्पष्ट नहीं था, तो c14n विहितीकरण के लिए एक संक्षिप्त नाम है
ब्रैंडिन

3
एक्सएमएल (xmllint --format) दोनों के प्रारूपण - रूपांतर से पहले एक अतिरिक्त चरण को निष्पादित करना बेहतर है। क्योंकि मैंने देखा है कि इस कदम के बिना आवश्यकता से अधिक अंतर दिखाई देता है।
ka3ak 12

23

जुका का जवाब मेरे काम नहीं आया, लेकिन इसने कैनोनिकल एक्सएमएल की ओर इशारा किया। न तो --c14n और न ही --c14n11 ने विशेषताओं को छांटा, लेकिन मुझे पता चला --exc-c14n स्विच ने विशेषताओं को क्रमबद्ध किया। --exc-c14n को मैन पेज में सूचीबद्ध नहीं किया गया है, लेकिन कमांड लाइन पर "W3C अनन्य विहित प्रारूप" के रूप में वर्णित किया गया है।

$ xmllint --exc-c14n one.xml > 1.xml
$ xmllint --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml

$ xmllint | grep c14
    --c14n : save in W3C canonical format v1.0 (with comments)
    --c14n11 : save in W3C canonical format v1.1 (with comments)
    --exc-c14n : save in W3C exclusive canonical format (with comments)

$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686

$ cat /etc/system-release
CentOS release 6.5 (Final)

चेतावनी - xcc-c14n xml हेडर को स्ट्रिप्स करता है जबकि --c14n xml हेडर को प्रीपे करता है यदि नहीं।


18

@Jukka Matilainen के उत्तर का उपयोग करने की कोशिश की, लेकिन सफेद-स्थान के साथ समस्या थी (फ़ाइलों में से एक एक विशाल-लाइनर था)। उपयोग --formatकरने से सफेद-अंतरिक्ष अंतर को छोड़ने में मदद मिलती है।

xmllint --format one.xml > 1.xml  
xmllint --format two.xml > 2.xml  
diff 1.xml 2.xml  

नोट: vimdiffxmls की साइड-बाय-साइड तुलना के लिए कमांड का उपयोग करें ।


मेरे मामले two.xmlमें one.xmlएक स्क्रिप्ट से उत्पन्न हुआ था । इसलिए मुझे केवल यह जांचने की आवश्यकता थी कि स्क्रिप्ट द्वारा क्या जोड़ा गया / हटाया गया।
गुरुग्राम

1
यह वह विकल्प था जिसकी मुझे जरूरत थी। माना जाता है कि सबसे विहित संस्करण के --formatसाथ संयोजन करके प्राप्त किया जा सकता है --exc-c14n; शायद अभी भी प्रक्रिया धीमी हो जाएगी :(
'

मुझे उत्तर लिखे हुए काफी समय हो चुका है, लेकिन मैं --exc-c14n ध्वज का उपयोग करते हुए बेहोश हो गया। हालाँकि, झंडे के साथ / बिना आउटपुट को अलग करना, कोई अंतर नहीं दिखाया गया है, इसलिए इसका उपयोग करना बंद कर दिया। अनावश्यक / अप्रयुक्त झंडे को गिराने से प्रक्रिया तेज हो सकती है।
गुरु

5
--exc-c14nविकल्प विशेषताओं की छँटाई निर्दिष्ट करता है। आपकी विशिष्ट फ़ाइलों में संभवतः विशेषताओं को पहले से ही सॉर्ट किया गया था, लेकिन संयोजन का उपयोग करने के लिए सामान्य सलाह होगी --format --exc-c14n

6

Diffxml को मूल कार्यक्षमता सही मिलती है, हालाँकि यह कॉन्फ़िगरेशन के लिए कई विकल्पों की पेशकश नहीं करता है।

संपादित करें: प्रोजेक्ट डिफैक्सिल 2013 से गिटहब में माइग्रेट किया गया है।


यह अभी तक काफी नहीं है, लेकिन यह कम से कम आशाजनक है।
qedi 17

बड़ी फ़ाइलों के लिए उपयोगी नहीं है, हालांकि 40GB (RAM + SWAP) खाने के बाद मृत्यु हो गई जब दो फ़ाइलों की तुलना ~ 20k लाइनों प्रत्येक
Grzegorz

ध्यान दें कि प्रोजेक्ट मृत प्रतीत होता है, 2013 में अंतिम अपडेट के साथ
मेटुसज़ कोनीज़नी

4

यदि आप भी बाल तत्वों के आदेश को अनदेखा करना चाहते हैं, तो मैंने इसके लिए एक सरल अजगर उपकरण लिखा है xmldiffs:

तत्व और विशेषता क्रम की अनदेखी करते हुए दो एक्सएमएल फाइलों की तुलना करें।

उपयोग: xmldiffs [OPTION] FILE1 FILE2

कोई भी अतिरिक्त विकल्प diffकमांड को दिया जाता है ।

इसे https://github.com/joh/xmldiffs पर प्राप्त करें


1

XML फ़ाइलों की तुलना करने के लिए मेरी पायथन लिपि xdiff.py व्हॉट्सएप या विशेषता क्रम में अंतर को अनदेखा करती है (तत्व आदेश के विपरीत)।

दो फ़ाइलों की तुलना करने के लिए 1.xmlऔर 2.xml, आप स्क्रिप्ट को निम्नानुसार चलाएंगे:

xdiff.py 1.xml 2.xml

ओपी के उदाहरण में, यह कुछ भी नहीं उत्पादन करेगा और निकास स्थिति 0(कोई संरचनात्मक या पाठीय अंतर के लिए) वापस करेगा।

ऐसे मामलों में जहां 1.xmlऔर 2.xmlसंरचनात्मक रूप से भिन्न होता है, यह GNU के एकीकृत उत्पादन की नकल करता है और निकास स्थिति देता है 1। आउटपुट को नियंत्रित करने के लिए कई विकल्प हैं, जैसे कि -aसभी संदर्भों के आउटपुट के लिए -n, बिना किसी संदर्भ के -qआउटपुट के लिए , और आउटपुट को पूरी तरह से दबाने के लिए (जबकि अभी भी निकास स्थिति लौटाते हैं)।


0

मैं सभी प्रकार के पाठ आधारित फाइलों की तुलना करने के लिए बियोंड की तुलना करता हूं । वे विंडोज और लिनक्स के लिए संस्करण तैयार करते हैं।


1
सादा पाठ तुलनाओं को दो पंक्तियों को अलग-अलग कहा जाएगा, जबकि ओपी चाहता है कि उन्हें समान रूप से रिपोर्ट किया जाए।
क्रिस डे

4
यानी Canonically XML की तुलना करें।
क्रिस डब्ल्यू। री।

1
बियॉन्ड तुलना वास्तव में इसके लिए बेकार है। ऐसा लगता है कि बस XML तत्वों के बारे में पता नहीं है और ज्यादातर पाठ तुलना करते हैं।
रॉब K

बियॉन्ड तुलना में एक XML प्लगइन है, लेकिन मैं इसे ठीक से स्थापित करने में सक्षम नहीं था, इसलिए ... न्हाय ... मैं इस पृष्ठ पर आया और समझदार हो गया ...
Erk

-1

हमारे एसडी स्मार्ट डिफरेंसर वास्तविक लेआउट के विपरीत संरचना के आधार पर दस्तावेजों की तुलना करते हैं ।

एक XML स्मार्ट डिफरेंसर है। XML के लिए, इसका मतलब है कि टैग और सामग्री का मिलान क्रम। यह ध्यान रखना चाहिए कि आपके द्वारा निर्दिष्ट विशिष्ट टुकड़े में पाठ स्ट्रिंग अलग था। यह वर्तमान में टैग विशेषताओं की XML धारणा को नहीं दर्शाता है जो यह दर्शाता है कि व्हॉट्सएप सामान्य बनाम महत्वपूर्ण है या नहीं।


1
अपने एसओ प्रोफ़ाइल में आप अपने नियोक्ता के बारे में पूर्ण प्रकटीकरण प्रदान करते हैं; मैंने आपके उत्तर के अंदर एक छोटा अस्वीकरण पसंद किया है :) BTW, मैंने मूल्यांकन कॉपी डाउनलोड करने का प्रयास किया, लेकिन अनुरोध फॉर्म 'स्मार्ट' (जेएस के माध्यम से) संयोजन के साथ XML को स्मार्ट डिफरेंसर (उत्तरार्द्ध) के साथ अक्षम करने के लिए पर्याप्त है अजगर के साथ संयोजन में, हालांकि एसडी उत्पाद पृष्ठ के अनुसार संभव है)?

1
आह। याद दिलाने के लिए शुक्रिया। यह उस समय से एक उत्तर है जब इस पर एक स्पष्ट एसओ नीति थी। मैं एसओ नीति अनुपालन उत्तर में संबंध को इंगित करने के लिए उत्तर को संशोधित कर रहा हूं।
इरा बैक्सटर

मैं डाउनलोड पृष्ठ की जाँच करूँगा; हमारे सभी जीवित उत्पाद उस सूची में नहीं हैं। हां, ये मौजूद हैं।
इरा बैक्सटर

मैंने डाउनलोड पृष्ठ की जाँच की। हाँ, एक्सएमएल स्मार्ट डिफरेंसर नहीं है। मुझे लगता है कि ठीक करने पर बैक-रूम लोग काम करेंगे; अधिकतम 1-2 सप्ताह में होना चाहिए (उनके पास एक बैकलॉग है, क्या हम सब नहीं?) इस बीच, यदि आप इसे आज़माना चाहते हैं, तो ईमेल भेजें (जैव देखें)।
इरा बाक्सटर

1
लिंक किए गए पृष्ठ में कोई शब्द "XML" नहीं है।
मटुस्ज़ कोनीकेज़नी

-1

यकीन नहीं है कि क्या (एक ऑनलाइन उपकरण की निर्भरता) एक समाधान के रूप में गिना जाता है लेकिन, इसके लायक क्या है, मुझे इस ऑनलाइन XML तुलना उपकरण में अच्छा परिणाम मिला है । यह बस काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.