2012-05-11 88 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