我有两个XML文件,我想将数据合并到与下面示例相同的结构中。实际文件更大,更复杂,因此复制和粘贴不是一种有效的选择。
有什么办法可以快速完成吗?
File1.xml:
<part1>
<g1> abc.
</g1></part1>
<part2>
<g2> def.
</g2></part2>
File2.xml:
<part1>
<g1> 123.
</g1></part1>
<part2>
<g2> 456.
</g2></part2>
Combined.xml
<part1>
<g1> abc. 123.
</g1></part1>
<part2>
<g2> def. 456.
</g2></part2>
答案 0 :(得分:0)
是的,有很多方法可以合并&#39; XML。但是你需要做的是XML解析器,因为XML是一种结构化数据格式。
您使用哪一个是您更喜欢哪种语言的问题?
我吗?我喜欢Perl和XML::Twig
:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
use Data::Dumper;
my $snippet1 = '<root><part1>
<g1> abc.
</g1></part1>
<part2>
<g2> def.
</g2></part2></root>';
my $snippet2 = '<root><part1>
<g1> 123.
</g1></part1>
<part2>
<g2> 456.
</g2></part2></root>';
my $first = XML::Twig->new()->parse($snippet1);
sub merge {
my ( $twig, $element ) = @_;
return unless $element->tag =~ m/^g/;
my $cur = $element;
my $xpath = '';
while ( $cur->parent ) {
$xpath = $cur->tag . "/" . $xpath;
$cur = $cur->parent;
}
# print "/",$xpath,"\n";
if ( my $other = $first->get_xpath( $xpath, 0 ) ) {
if ( $element->text_only
and $other->text_only )
{
$element->set_text(
( $other->text_only . " " . $element->text_only ) =~ s/\n//rg );
}
}
}
my $combined = XML::Twig->new(
pretty_print => 'indented_a',
twig_handlers => { '_all_' => \&merge }
)->parse($snippet2)->print;
这会将您的源文本转换为:
<root>
<part1>
<g1> abc. 123.</g1>
</part1>
<part2>
<g2> def. 456.</g2>
</part2>
</root>
但我确定您可以选择更好的路线,以及您可以使用的其他语言。