4

2つのXMLファイルがあります。両方のXMLファイルの構造は次のとおりです。

<file1>
       <table>
              <name>...</name>
              <columns>
                       <col>
                             <name>...</name>
                             <type>...</type>
                             <fkey>...</fkey>
                       </col>
                       <col>
                             <name>...</name>
                             <type>...</type>
                             <fkey>...</fley>
                       </col>
               <columns>
       </table>
      <table>
              <name>...</name>
              <columns>
                       <col>
                             <name>...</name>
                             <type>...</type>
                             <fkey>...</fkey>
                       </col>
                       <col>
                             <name>...</name>
                             <type>...</type>
                             <fkey>...</fley>
                       </col>
               <columns>
       </table>
 </file1>

両方のXMLファイルには同じテーブルがありますが、列の数は異なる場合があります。私がやろうとしているのは、各テーブルの各列を比較し、typeとfkeyの違い(ある場合)を見つけることです。また、2番目のXMLファイルからどの列が欠落しているかを知りたいです。そして、この情報を別のファイルに保存したいと思います(任意の形式にすることができます)。

私はPerl、PHP、JavaScriptを知っていますが、これまでXMLを扱ったことがありません。

今私が知りたいのは、どこから始めて、どのツールを使用するかです。上記のタスクを実行するための最良の方法は何でしょうか?2つのXMLファイル間で差分を実行する機能を提供するモジュールはありますか?

編集:私はLinuxプラットフォーム(RedHat)に取り組んでいます。

4

2 に答える 2

2

私はかつて似たようなことをするモジュールを書いたことがあります(最適化されていませんが、それは私のためにトリックをしました)

http://ekawas.blogspot.ca/2008/11/comparing-xml-documents-semantically.html

  use XML::SemanticCompare;
  my $x = XML::SemanticCompare->new;

  # compare 2 different files
  my $isSame = $x->compare($control_xml, $test_xml);
  # are they the same
  print "XML matches!\n"
    if $isSame;
  print "XML files are semantically different!\n"
    unless $isSame;

  # get the diffs
  my $diffs_arrayref = $x->diff($control_xml, $test_xml);
于 2012-04-11T12:51:55.997 に答える
1

Perlソリューションについては、関連するCPANモジュールをご覧ください。XML::Diffは最も明白で、必要なことを実行しているように見えますが、それがうまくいかない場合は、いくつか試してみる必要があります。

于 2012-04-11T11:42:00.263 に答える