2015-06-20 110 views
1

我能夠在XML :: Twig模塊的幫助下合併兩個XML文件數據,但在某些情況下,在兩個XML文件中都有相同標記出現的機會在這種情況下,我需要保持第一個文件的數據不變,並從第二個文件中刪除它。有人可以讓我知道如何通過XML::Twig來實現嗎?在合併兩個XML文件時從第二個XML文件中刪除公共XML標記

下面是我使用合併兩個XML數據

首先XML數據

<config> 
    <tag1>A1</tag1> 
    <tag2>A2</tag2> 
</config> 

二XML數據的代碼

<config> 
    <tag2>A2</tag2> 
    <tag3>A1</tag3> 
    <opt> 
     <user login="grep" fullname="BOB" /> 
     <user login="stty" fullname="TOM" /> 
    </opt> 
</config> 

<tag2>數據出現在這兩個文件中。我需要從第二個文件中刪除重複的數據。

代碼

use XML::Twig; 
use Data::Dumper; 
use XML::Simple; 

print add(
    'C:\Users\chidori\Desktop\inputfile1.xml', 
    'C:\Users\chidori\Desktop\inputfile2.xml' 
); 

sub add { 
    my $result_twig; 
    my ($XML_File1, $XML_File2) = @_; 

    foreach my $file ($XML_File1, $XML_File2) { 

     my $current_twig = XML::Twig->new(
      pretty_print => 'indented', 
      comments  => 'process', 
     ); 

     $current_twig->parsefile($file); 

     if (!$result_twig) { 
      $result_twig = $current_twig; 
     } 
     else { 
      $current_twig->root->move(last_child => $result_twig->root)->erase; 
     } 
    } 

    return $result_twig->sprint; 
} 
+0

你應該至少在嘗試免費諮詢 – Borodin

+0

@Borodin之前自己嘗試這樣做。我在嘗試。以爲我可以在這裏得到一些指針。 – chidori

+0

顯示您的代碼,並描述您遇到的問題以及結果與您的要求不符的原因,我們將幫助您解決問題。我會給你的第一個指針是正確縮進你的代碼,以便你可以閱讀你寫的東西。在這種情況下,我已經爲你做了這件事,但我不應該要 – Borodin

回答

2

此解決方案通過將所有的第一級元素的標籤名稱爲哈希%tags。在處理第二個文件,每一級元素剪切並粘貼到原文檔,如果它的標記名稱是不是已經存在於哈希

use strict; 
use warnings; 

use XML::Twig; 

my %tags; 

my $twig = XML::Twig->parse('inputfile1.xml'); 

++$tags{$_->tag} for $twig->findnodes('/config/*'); 


{ 
    my $twig2 = XML::Twig->parse('inputfile2.xml'); 

    for my $elem ($twig2->findnodes('/config/*')) { 
     unless ($tags{$elem->tag}) { 
     $elem->cut; 
     $elem->paste(last_child => $twig->root); 
     } 
    } 
} 

$twig->set_pretty_print('indented'); 
$twig->print; 

輸出

<config> 
    <tag1>A1</tag1> 
    <tag2>A2</tag2> 
    <tag3>A1</tag3> 
    <opt> 
    <user fullname="BOB" login="grep"/> 
    <user fullname="TOM" login="stty"/> 
    </opt> 
</config> 
+0

真的有幫助。謝謝 – chidori