Perl XML :: Twig使用另一个XML更新XML文件

时间:2012-05-11 13:58:58

标签: xml perl xml-twig

这是我的问题,我需要使用另一个xml

更新xml文件

Data.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中的infos更新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);

employeenumber是唯一的,我在一个新文件中写入data2.xml的每个元素,并将每个雇员数存储在一个数组中。然后我解析data.xml并写入每个元素,除非它存在于数组中。

这种方法根本没有效率。因此,我不想重写所有data.xml,而是想删除数组中存在的data.xml中的每个元素(因此在data2.xml中)。然后将data2.xml中的元素附加到data.xml

我的问题是我找不到使用XML Twig从xml文件中删除元素的方法。

有人有什么想法吗?

提前致谢,

西蒙。

1 个答案:

答案 0 :(得分:2)

通过快速查看代码,在我看来,您可以多次,多次打印这两个文件。实际上,当您执行$diff->print时,您会为找到的每个元素打印整个文件。我没有真正调试过你的代码,但我怀疑你想在那里使用flush代替print。尝试一下,如果事情有所改善,请告诉我们。