如何将来自两个XML文件的数据合并到同一个结构中?

时间:2015-06-09 19:50:04

标签: xml merge

我有两个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>

1 个答案:

答案 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>

但我确定您可以选择更好的路线,以及您可以使用的其他语言。