farklı satırlarda aynı verilere sahip iki xml dosyası nasıl karşılaştırılır?


9

Aynı veriye sahip iki dosyam var ama farklı satırlarda.

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

Dosya 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 file2Komutu kullanırsam aşağıdaki cevabı alıyorum:

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>

Ama fark etmem gerekiyor, çünkü bu dosyalar farklı satırlarda aynı verilere sahip.


Bunları sıralı olarak sıralayarak ve karşılaştırarak eşit olup olmadıklarını kontrol edebilirsiniz . Tabii ki, sıralamadan sonra eşit olma, sıralama XML sözdizimini yok ettiği için gerçekten eşit oldukları anlamına gelmez.
jofel

Nasıl çözüleceğini bilmiyorum. dosya1 a sonra b ve dosya2 b sonra a. diff -y -B -Z -b --strip-trailing-cr file1 file2 ile soru ortaya
koyabilirsiniz

2
Sen-ebilmek denemek xmldiff, ama sipariş genel XML ile ilgili olduğu için, bu hala sipariş değiştiğini fark düşünüyorum. Bence en iyi yaklaşım her dosya kanonik bir düzen ve biçimde koymak için bir XML ayrıştırıcı ve jeneratör kullanmak, sonra xmldiffveya kullanın diff. En sevdiğiniz komut dosyası dili (Perl, Ruby, Python, vb.) İçin bir iş.
derobert

Yanıtlar:


6

Küçük bir Python betiği ile istediğinizi elde edebilirsiniz (Python'un yanı sıra lxmlaraç setine de ihtiyacınız olacak ).

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)

Bu komut dosyası, XML dokümanı kökü altındaki birinci düzey öğeleri, ikinci düzey bir öğenin içeriğine göre sıralar ve sonucu stdout'a gönderir. Buna şöyle denir:

$ python tagsort.py filename tag

Bunu elde ettikten sonra , çıktısına göre bir fark almak için işlem ikamesini kullanabilirsiniz (boş olmayan bir sonuç göstermek için bir öğe ekledim ve örnek dosyalarınıza başka bir tane değiştirdim):

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

3

Benzer bir sorunum vardı ve sonunda buldum: /superuser/79920/how-can-i-diff-two-xml-files

Bu yazı bir kanonik xml sıralama sonra bir fark yapıyor önerir. Linux, mac kullanıyorsanız veya cygwin gibi bir şey Windows yüklü ise aşağıdakiler sizin için çalışmalıdır:

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

0

Kabuk olarak etiketlendi, ama dürüst olmak gerekirse bir ayrıştırıcı ile bir komut dosyası dili kullanmayı tercih ediyorum. Bu durumda perlile XML::Twig.

Böyle bir şey gider:

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

Bir kerede bir 'Kimlik' öğesini açıkça karşılaştırıyorum ve birindeki tüm alanların aynı değerle diğerinde var olduğunu kontrol ediyorum.

Ve sonra tersine çevirir, çünkü ikinci dosyanın fazladan girdileri olabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.