विभिन्न लाइनों में समान डेटा वाले दो xml फ़ाइलों की तुलना कैसे करें?


9

मेरे पास दो फाइलें समान डेटा हैं लेकिन विभिन्न लाइनों में हैं।

फ़ाइल 1:

<Identities>
    <Identity>
        <Id>048206031415072010Comcast.USR8JR</Id>
        <UID>ccp_test_79</UID>
        <DisplayName>JOSH CCP</DisplayName>
        <FirstName>JOSH</FirstName>
        <LastName>CCP</LastName>
        <Role>P</Role>
        <LoginStatus>C</LoginStatus>
    </Identity>
    <Identity>
        <Id>089612381523032011Comcast.USR1JR</Id>
        <UID>94701_account1</UID>
        <DisplayName>account1</DisplayName>
        <FirstName>account1</FirstName>
        <LastName>94701</LastName>
        <Role>S</Role>
        <LoginStatus>C</LoginStatus>
    </Identity>
</Identities>

फ़ाइल 2:

<Identities>
    <Identity>
        <Id>089612381523032011Comcast.USR1JR</Id>
        <UID>94701_account1</UID>
        <DisplayName>account1</DisplayName>
        <FirstName>account1</FirstName>
        <LastName>94701</LastName>
        <Role>S</Role>
        <LoginStatus>C</LoginStatus>
    </Identity>
    <Identity>
        <Id>048206031415072010Comcast.USR8JR</Id>
        <UID>ccp_test_79</UID>
        <DisplayName>JOSH CCP</DisplayName>
        <FirstName>JOSH</FirstName>
        <LastName>CCP</LastName>
        <Role>P</Role>
        <LoginStatus>C</LoginStatus>
    </Identity>
</Identities>

यदि मैं diff file1 file2कमांड का उपयोग करता हूं तो मुझे प्रतिक्रिया के नीचे मिल रहा है:

1,10d0
<     <Identities>
<         <Identity>
<             <Id>048206031415072010Comcast.USR8JR</Id>
<             <UID>ccp_test_79</UID>
<             <DisplayName>JOSH CCP</DisplayName>
<             <FirstName>JOSH</FirstName>
<             <LastName>CCP</LastName>
<             <Role>P</Role>
<             <LoginStatus>C</LoginStatus>
<         </Identity>
20a11,20
>     <Identities>
>         <Identity>
>             <Id>048206031415072010Comcast.USR8JR</Id>
>             <UID>ccp_test_79</UID>
>             <DisplayName>JOSH CCP</DisplayName>
>             <FirstName>JOSH</FirstName>
>             <LastName>CCP</LastName>
>             <Role>P</Role>
>             <LoginStatus>C</LoginStatus>
>         </Identity>

लेकिन मुझे कोई अंतर नहीं पड़ना चाहिए, क्योंकि इन फ़ाइलों में अलग-अलग लाइनों में एक ही डेटा है।


उन्हें अलंकृत करके और तुलना करके, आप जांच सकते हैं कि क्या वे समान नहीं हैं । बेशक, छँटाई के बाद समान का मतलब यह नहीं है कि वे वास्तव में समान हैं क्योंकि छँटाई के रूप में एक्सएमएल सिंटैक्स को नष्ट कर देता है।
जोफेल

इसे हल करने का तरीका नहीं जानते। वे file1 में तत्कालीन बी और फाइल 2 बी में क्रम से भिन्न होते हैं तब ए। आप diff -y -B -Z बी --strip-पीछे चल करोड़ file1 file2 साथ सवाल बेनकाब कर सकते हैं
Yurij73

2
आप कोशिश कर सकते हैं xmldiff, लेकिन मुझे लगता है कि अभी भी ऑर्डर बदलने पर ध्यान दिया जाएगा, क्योंकि जेनेरिक XML में ऑर्डर प्रासंगिक है। मुझे लगता है कि आपका सबसे अच्छा तरीका एक XML पार्सर और जनरेटर का उपयोग करना है ताकि प्रत्येक फ़ाइल को एक विहित आदेश और प्रारूप में रखा जा सके, फिर उपयोग करें xmldiffया diff। आपकी पसंदीदा स्क्रिप्टिंग भाषा के लिए एक नौकरी (पर्ल, रूबी, पायथन, आदि)।
derobert

जवाबों:


6

आप एक छोटे से पाइथन स्क्रिप्ट की मदद से जो चाहें प्राप्त कर सकते हैं (आपको पायथन की आवश्यकता होगी, साथ ही lxmlटूलकिट भी)।

tagsort.py:

#!/usr/bin/python

import sys
from lxml import etree

filename, tag = sys.argv[1:]

doc = etree.parse(filename, etree.XMLParser(remove_blank_text=True))
root = doc.getroot()
root[:] = sorted(root, key=lambda el: el.findtext(tag))
print etree.tostring(doc, pretty_print=True)

यह स्क्रिप्ट दूसरे स्तर के तत्व की सामग्री द्वारा XML दस्तावेज़ रूट के तहत प्रथम-स्तरीय तत्वों को क्रमबद्ध करती है, जिससे परिणाम को स्टडआउट किया जाता है। इसे इस तरह कहा जाता है:

$ python tagsort.py filename tag

एक बार जब आप ऐसा कर लेते हैं, तो आप इसके आउटपुट के आधार पर भिन्नता प्राप्त करने के लिए प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं (मैंने एक तत्व जोड़ दिया है और एक गैर-रिक्त परिणाम दिखाने के लिए आपके उदाहरण फ़ाइलों में दूसरा बदल दिया है):

$ diff <(python tagsort.py file1 Id) <(python tagsort.py file2 Id)
4a5
>     <AddedTag>Something</AddedTag>
17c18
<     <Role>X</Role>
---
>     <Role>S</Role>

3

मुझे इसी तरह की समस्या थी और मुझे आखिरकार मिल गया: /superuser/79920/how-can-i-diff-two-xml-files

उस पोस्ट से पता चलता है कि एक विहित xml सॉर्ट करना फिर एक अंतर करना। अगर आप linux, mac पर हैं, या यदि आपके पास कुछ है, जैसे कि cygwin इनस्टॉल है, तो निम्न कार्य करने चाहिए:

$ xmllint --c14n File1.xml > 1.xml
$ xmllint --c14n File2.xml > 2.xml
$ diff 1.xml 2.xml

0

यह शेल टैग किया गया है, लेकिन ईमानदारी से मैं एक पार्सर के साथ एक स्क्रिप्टिंग भाषा का उपयोग करना पसंद करता हूं। इस मामले में perlसाथ XML::Twig

यह कुछ इस तरह चलता है:

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;

sub compare_by_identity {
   my ( $first, $second ) = @_;
   foreach my $identity ( $first->get_xpath('//Identity') ) {
      my $id = $identity->first_child_text('Id');

      print $id, "\n";
      my $compare_to =
        $second->get_xpath( "//Identity/Id[string()=\"$id\"]/..", 0 );
      if ($compare_to) {
         print "Matching element found for ID $id\n";
         foreach my $element ( $identity->children ) {
            my $tag  = $element->tag;
            my $text = $element->text;
            if ( not $element->text eq $compare_to->first_child_text($tag) ) {
               print "$id, $tag has value $text which doesn't match: ",
                 $compare_to->first_child_text($tag), "\n";
            }
         }
      }
      else {
         print "No matching element for Id $id\n";
      }
   }
}

my $first_file  = XML::Twig->new->parsefile('test1.xml');
my $second_file = XML::Twig->new->parsefile('test2.xml');

compare_by_identity( $first_file,  $second_file );
compare_by_identity( $second_file, $first_file );

मैं स्पष्ट रूप से एक समय में एक 'आइडेंटिटी' तत्व की तुलना कर रहा हूं, और यह जांच रहा हूं कि सभी फ़ील्ड एक में, समान मूल्य के साथ दूसरे में मौजूद हैं।

और फिर उसे उलट कर, क्योंकि दूसरी फ़ाइल में अतिरिक्त प्रविष्टियाँ हो सकती हैं।

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