Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl XML::Twig使用另一个XML更新XML文件_Xml_Perl_Xml Twig - Fatal编程技术网

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

Perl XML::Twig使用另一个XML更新XML文件,xml,perl,xml-twig,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</se

这是我的问题,我需要使用另一个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>
employeenumber是唯一的,我将data2.xml的每个元素写入一个新文件,并将每个employeenumber存储在一个数组中。然后我解析data.xml并写入每个元素,除非它存在于数组中

这种方法一点也不有效。因此,我不想重新编写所有的data.xml,而是想从data.xml中删除数组中存在的每个元素(因此在data2.xml中)。然后将data2.xml中的元素追加到data.xml中

我的问题是,我找不到使用xml细枝从xml文件中删除元素的方法

有人有什么想法吗

提前感谢,


Simon。

通过快速查看您的代码,我觉得您似乎多次打印了这两个文件。实际上,当您执行
$diff->print
时,您会为找到的每个元素打印整个文件。我还没有真正调试您的代码,但我怀疑您想使用
flush
而不是
print
。试试看,如果情况有所改善,请告诉我们

好的,我不明白我可以用flush写入文件。谢谢现在执行代码需要20分钟,而不是6小时。相当大的进步。非常感谢。
print
打印整个树,而
flush
打印到目前为止已处理的内容,跟踪尚未关闭的元素,然后释放内存,这样整个树就不需要保存在内存中
<?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>
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);