1

これが私の問題です。別のxmlを使用してxmlファイルを更新する必要があります

データ.xml:

<?xml version='1.0'?>
<employees>
<employee>
    <employeenumber>V0000001</employeenumber>
    <name>John Doe</name>
    <age>43</age>
    <sex>M</sex>
    <department>Operations</department>
</employee>
<employee>
    <employeenumber>V0000002</employeenumber>
    <name>Jane Doe</name>
    <age>35</age>
    <sex>F</sex>
    <department>Operations</department>
</employee>
<employee>
    <employeenumber>V0000003</employeenumber>
    <name>Jane Doe</name>
    <age>35</age>
    <sex>F</sex>
    <department>Operations</department>
</employee>
<employee>
    <employeenumber>V0000004</employeenumber>
    <name>Jane Doe</name>
    <age>35</age>
    <sex>F</sex>
    <department>Operations</department>
</employee>
<employee>
    <employeenumber>V0000005</employeenumber>
    <name>Jane Doe</name>
    <age>35</age>
    <sex>F</sex>
    <department>Operations</department>
</employee>
</employees>

Data2.xml :

<?xml version='1.0'?>
<employees>
<employee>
    <employeenumber>V0000002</employeenumber>
    <name>Jane Doe</name>
    <age>34</age>
    <sex>F</sex>
    <department>Management</department>
</employee>
<employee>
    <employeenumber>V0000004</employeenumber>
    <name>Jane Doe</name>
    <age>34</age>
    <sex>F</sex>
    <department>Sales</department>
</employee>
</employees>

したがって、Data2.xml からの情報で Data.xml を更新する必要があります。

私はこのコードを書きました。動作していますが、実行に 6 時間かかります。Data.xml はかなり大きいです (250mo)。

use XML::Twig;
my %soi = ();
open(FILE,">out.txt");


my $diff= XML::Twig->new( pretty_print => 'indented',
                        twig_handlers => 
                       { 'employees/employee' => \&stock_n_purge,}
                   )
              ->parsefile( 'data2.xml');


sub stock_n_purge
{ 
my( $diff, $elt)= @_;
$soi{$elt->first_child ("employeenumber")->text} = "1"; # stock l'element dans un tableau
$diff->print(\*FILE); 
printf "Found One";
$diff->purge;# frees the memory
}


my $full= XML::Twig->new( pretty_print => 'indented',
                        twig_handlers => 
                       { 'employees/employee' => \&stock_n_purge2,}
                   )
              ->parsefile( 'data.xml');


sub stock_n_purge2
{ 
my( $diff2, $elt2)= @_;
$diff2->print(\*FILE) unless (exists( $soi{$elt2->first_child ("employeenumber")->text} )); 
$diff2->purge;   # frees the memory
}

close(FILE);

従業員番号は一意であるため、data2.xml のすべての要素を新しいファイルに書き込み、すべての従業員番号を配列に格納します。次に、data.xml を解析し、配列に存在しない限り、すべての要素を書き込みます。

この方法はまったく効率的ではありません。したがって、すべての data.xml を書き直す代わりに、配列 (したがって data2.xml) に存在する data.xml からすべての要素を削除したいと思います。次に、data2.xml から data.xml に要素を追加します。

私の問題は、XML Twig を使用して xml ファイルから要素を削除する方法が見つからないことです。

誰にもアイデアはありますか?

前もって感謝します、

サイモン。

4

1 に答える 1

2

あなたのコードをざっと見てみると、両方のファイルを何度も何度も印刷しているように思えます。実際、実行すると、見つかったすべての要素のファイル全体が出力されます$diff->print。私はあなたのコードを実際にデバッグしていませんが、flush代わりに使用したいと思っていますprint。試してみて、状況が改善されたかどうかをお知らせください。

于 2012-05-11T15:24:23.003 に答える