Как объединить данные из двух файлов 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>
Но я уверен, что есть лучшие маршруты и другие языки, которые вы можете использовать.