Как объединить данные из двух файлов XML в одну структуру?

У меня есть два 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 ответ

Да, есть множество способов "объединить" 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>

Но я уверен, что есть лучшие маршруты и другие языки, которые вы можете использовать.

Другие вопросы по тегам