বিভিন্ন লাইনে একই ডাটা থাকা দুটি এক্সএমএল ফাইলের তুলনা কীভাবে করা যায়?


9

আমার দুটি ফাইলের একই ডেটা রয়েছে তবে বিভিন্ন লাইনে in

ফাইল 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>

তবে আমার কোনও পার্থক্য পাওয়া দরকার, কারণ এই ফাইলগুলির বিভিন্ন লাইনে একই ডেটা রয়েছে।


সেগুলি লাইনওয়াইজ করে বা তুলনা করে আপনি সেগুলি সমান না কিনা তা পরীক্ষা করতে পারেন । অবশ্যই, বাছাইয়ের পরে সমান অর্থ এই নয় যে তারা সত্যই সমান হিসাবে বাছাই করা XML সিনট্যাক্সকে ধ্বংস করে।
জোফেল

কীভাবে সমাধান করবেন তা জানেন না। তারা ফাইল 1 ক এর পরে বি এবং ফাইল 2 বিতে ক এর পরে আলাদা হয়। আপনি ডিফার-বি-জেড-বি - স্ট্রিপ-ট্রেইলিং-সিআর ফাইল 1 ফাইল 2 দিয়ে প্রশ্ন ফাঁস করতে পারেন
ইউরিজ 73

2
আপনি চেষ্টা করতে পারেন xmldiff, তবে আমি মনে করি এটি এখনও আদেশটি পরিবর্তন লক্ষ্য করবে, কারণ জেনেরিক এক্সএমএলে আদেশ প্রাসঙ্গিক। আমি মনে করি যে আপনার সর্বোত্তম পদ্ধতির প্রতিটি ফাইলকে ক্যানোনিকাল অর্ডার এবং ফর্ম্যাটে রাখতে একটি এক্সএমএল পার্সার এবং জেনারেটর ব্যবহার করা xmldiffবা তারপরে বা ব্যবহার করা উচিত diff। আপনার প্রিয় স্ক্রিপ্টিং ভাষার জন্য একটি চাকরি (পার্ল, রুবি, পাইথন, ইত্যাদি)।
ডারোবার্ট

উত্তর:


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)

এই স্ক্রিপ্টটি দ্বিতীয় স্তরের উপাদানগুলির সামগ্রী দ্বারা এক্সএমএল ডকুমেন্ট রুটের অধীনে প্রথম স্তরের উপাদানগুলি সাজায়, ফলাফলকে স্টাডাউটে প্রেরণ করে। এটিকে এভাবে বলা হয়:

$ 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

এই পোস্টটি একটি ক্যানোনিকাল এক্সএমএল বাছাই করার পরে আলাদা করার পরামর্শ দেয়। নিম্নলিখিতটি আপনার জন্য কাজ করা উচিত যদি আপনি লিনাক্স, ম্যাকের উপর থাকেন বা আপনার যদি উইন্ডোজ সাইগউইনের মতো কিছু ইনস্টল থাকে:

$ 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 );

আমি স্পষ্টভাবে একবারে একটি 'পরিচয়' উপাদানটির তুলনা করছি এবং যা যা একের মধ্যে সমস্ত ক্ষেত্র একই মান সহ অন্যটিতে উপস্থিত রয়েছে তা পরীক্ষা করে নিচ্ছি।

এবং তারপরে এটি বিপরীত কারণ দ্বিতীয় ফাইলটিতে অতিরিক্ত এন্ট্রি থাকতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.