bagaimana cara membandingkan dua file xml yang memiliki data yang sama di baris yang berbeda?


9

Saya punya dua file memiliki data yang sama tetapi dalam baris yang berbeda.

File 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>

File 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>

Jika saya menggunakan diff file1 file2perintah, saya mendapatkan respons di bawah ini:

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>

Tapi saya tidak perlu mendapat perbedaan, karena file-file ini memiliki data yang sama di baris yang berbeda.


Dengan menyortir dan membandingkan, Anda dapat memeriksa apakah keduanya tidak sama . Tentu saja, sama setelah penyortiran tidak berarti bahwa mereka benar-benar sama seperti penyortiran menghancurkan sintaks XML.
jofel

Tidak tahu bagaimana menyelesaikannya. mereka berbeda berdasarkan urutan dalam file1 a lalu b dan dalam file2 b maka a. Anda dapat membuka pertanyaan dengan diff -y -B -Z -b --strip-trailing-cr file1 file2
Yurij73

2
Anda dapat mencoba xmldiff, tetapi saya pikir itu masih akan melihat perubahan pesanan, karena pesanan relevan dalam XML umum. Saya pikir pendekatan terbaik Anda adalah menggunakan parser & generator XML untuk meletakkan setiap file dalam urutan dan format kanonik, kemudian gunakan xmldiffatau diff. Pekerjaan untuk bahasa skrip favorit Anda (Perl, Ruby, Python, dll.).
derobert

Jawaban:


6

Anda dapat mencapai apa yang Anda inginkan dengan bantuan skrip Python kecil (Anda harus memasang Python, serta lxmltoolkit).

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)

Skrip ini mengurutkan elemen tingkat pertama di bawah akar dokumen XML dengan konten elemen tingkat kedua, mengirimkan hasilnya ke stdout. Disebut seperti ini:

$ python tagsort.py filename tag

Setelah Anda mendapatkannya, Anda dapat menggunakan subtitusi proses untuk mendapatkan perbedaan berdasarkan hasilnya (Saya telah menambahkan satu elemen dan mengubah elemen lainnya di file contoh Anda untuk menampilkan hasil yang tidak kosong):

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

3

Saya memiliki masalah yang serupa dan akhirnya menemukan: /superuser/79920/how-can-i-diff-two-xml-files

Posting itu menyarankan untuk melakukan semacam xml kanonik kemudian melakukan diff. Berikut ini akan berfungsi untuk Anda jika Anda berada di linux, mac, atau jika Anda memiliki windows seperti cygwin diinstal:

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

0

Ini ditandai shell, tapi jujur ​​saya lebih suka menggunakan bahasa scripting dengan parser. Dalam hal ini perldengan XML::Twig.

Bunyinya seperti ini:

#!/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 );

Saya secara eksplisit membandingkan satu elemen 'Identitas' pada suatu waktu, dan memeriksa bahwa semua bidang dalam satu, ada di yang lain, dengan nilai yang sama.

Dan kemudian membalikkan itu, karena file kedua mungkin memiliki entri tambahan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.