จะเปรียบเทียบไฟล์ 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>

แต่ฉันต้องไม่แตกต่างเพราะไฟล์เหล่านี้มีข้อมูลเหมือนกันในบรรทัดที่ต่างกัน


โดยเรียงลำดับ linewise พวกเขาและเปรียบเทียบคุณสามารถตรวจสอบว่าพวกเขาจะไม่เท่ากัน แน่นอนว่าเท่าเทียมกันหลังจากการเรียงลำดับไม่ได้หมายความว่าพวกเขาจะเท่ากันจริงๆเมื่อการเรียงลำดับทำลายไวยากรณ์ XML
jofel

ไม่ทราบวิธีแก้ปัญหา พวกเขาต่างกันตามลำดับใน file1 a จากนั้น b และใน file2 b จากนั้น a คุณอาจเปิดเผยคำถามกับ diff -y -B -Z -b --strip-trailing-cr file1 file2
Yurij73

2
คุณสามารถลองxmldiffได้ แต่ฉันคิดว่าจะยังคงสังเกตเห็นการเปลี่ยนแปลงคำสั่งซื้อเนื่องจากคำสั่งซื้อนั้นเกี่ยวข้องใน XML ทั่วไป ผมคิดว่าวิธีที่ดีที่สุดของคุณคือการใช้ตัวแยกวิเคราะห์ XML และเครื่องกำเนิดไฟฟ้าที่จะนำแต่ละไฟล์ในลำดับที่ยอมรับและรูปแบบแล้วใช้หรือxmldiff diffงานสำหรับภาษาสคริปต์ที่คุณชื่นชอบ (Perl, Ruby, Python และอื่น ๆ )
Derobert

คำตอบ:


6

คุณสามารถบรรลุสิ่งที่คุณต้องการด้วยความช่วยเหลือของสคริปต์ Python ขนาดเล็ก (คุณจะต้องติดตั้ง Python และ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 โดยเนื้อหาขององค์ประกอบระดับที่สองโดยส่งผลลัพธ์ไปยัง stdout มันเรียกแบบนี้:

$ 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 ตามบัญญัติแล้วทำการ diff ข้อมูลต่อไปนี้ควรใช้กับคุณหากคุณใช้งานบน linux, mac หรือหากคุณมีหน้าต่างติดตั้งเช่น cygwin:

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

0

เป็นแท็กเชลล์ แต่จริงๆแล้วฉันชอบใช้ภาษาสคริปต์กับตัวแยกวิเคราะห์ ในกรณีนี้ด้วยperlXML::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 );

ฉันกำลังเปรียบเทียบองค์ประกอบ 'เอกลักษณ์' อย่างชัดเจนในแต่ละครั้งและตรวจสอบว่าเขตข้อมูลทั้งหมดในหนึ่งมีอยู่ในที่อื่นด้วยค่าเดียวกัน

จากนั้นย้อนกลับเนื่องจากไฟล์ที่สองอาจมีรายการเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.