合并两个 XML 文件时从第二个 XML 文件中删除公共 XML 标签
Delete common XML tags from second XML file while merging two XML files
我可以在 XML::Twig 模块的帮助下合并两个 XML 文件数据,但在某些情况下,相同的标签有可能出现在两个 XML 文件中一种情况我需要保持第一个文件中的数据完好无损并从第二个文件中删除它。有人可以让我知道如何通过 XML::Twig
实现吗?
下面是我用来合并两个 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;
}
此解决方案的工作原理是将所有一级元素的标签名称添加到散列 %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>
我可以在 XML::Twig 模块的帮助下合并两个 XML 文件数据,但在某些情况下,相同的标签有可能出现在两个 XML 文件中一种情况我需要保持第一个文件中的数据完好无损并从第二个文件中删除它。有人可以让我知道如何通过 XML::Twig
实现吗?
下面是我用来合并两个 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;
}
此解决方案的工作原理是将所有一级元素的标签名称添加到散列 %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>