2012-05-11 57 views
1

这里枝条更新XML文件是我的问题,我需要使用另一个XMLPerl的XML ::另一个XML

data.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); 

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

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

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

有没有人有任何想法?

在此先感谢,

Simon。

+0

小枝具有删除元素的“删除”方法。 – toolic

回答

2

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

+0

好吧,我不明白,我可以用flush写入文件。谢谢。代码需要20分钟来执行,而不是6小时。相当一个改进^^。 非常感谢。 – user1361295

+0

'print'打印整个树,而'flush'打印迄今为止已处理的内容,跟踪尚未关闭的元素,然后释放内存,因此整个树不需要保存在内存中 – mirod