Я пытаюсь добавить дочерний элемент к узлу в XML с помощью XML: Twig. мой XML являетсяКак добавить дочерний элемент к узлу в XMl с помощью XML: Perl
<Install>
<version >
<number>6.0</number>
<build>1037124</build>
<path>path</path>
<kind>kind</kind>
</version>
<version >
<number>7.0</number>
<build>1037124</build>
<path>path</path>
<kind>kind</kind>
</version>
</Install>
и выход я хочу это: -
<Install>
<version >
<number>6.0</number>
<build>1037124</build>
<path>path/path>
<kind>kind</kind>
<patch>patch</patch>
<patchv>patchv</patchv>
</version>
<version >
<number>7.0</number>
<build>1037124</build>
<path>path</path>
<kind>kind</kind>
</version>
</Install>
Я хочу добавить два новых дочернего узла к родительскому версии, где число 6,0
Я попробовал этот код
my $version = "6.0";
my $file_loc = "data.xml";
my $twig = XML::Twig->new(pretty_print => 'indented_a')->parsefile($file_loc);
for my $number ($twig->findnodes('/Install/version/number')) {
$number->parent->last_child->insert(
patch => { version =>'patch' },
patchversion => { version =>'patchv' },
) if $number->trimmed_text eq $version;
}
но выход, который я получаю, не является тем, что я хочу. выход: -
<Install>
<version>
<number>6.0</number>
<build>1037124</build>
<path>path</path>
<kind>
<patch version="patch">
<patchversion version="patchv">kind</patchversion>
</patch>
</kind>
</version>
<version >
<number>7.0</number>
<build>1037124</build>
<path>path</path>
<kind>kind</kind>
</version>
</Install>
Я попытался это с другим способом, также с помощью пасты следующим образом: -
my $version = "6.0";
my $file_loc = "data.xml";
my $myXML = <<"XML";
<patch>
<build></build>
<version></version>
</patch>
XML
my $t = XML::Twig->new(
twig_handlers => {
Install => sub { add_version($myXML, @_); }, }
)->parsefile($file_loc) or die $!;
$t->set_pretty_print('indented_c');
open my $xml_fh, '>', "$file_loc" or die $!;
$t->print($xml_fh);
sub add_version {
my ($xml, $t, $install) = @_;
my $new_elt = XML::Twig::Elt->parse($xml);
for my $number ($t->findnodes('/Install/version/number')) {
if($number->trimmed_text eq $version)
{
$new_elt->paste( $number->parent->last_child->paste => $install);
}
}
}
здесь я получаю следующее сообщение об ошибке
cannot paste an element that belongs to a tree at
можно достичь этого используя только вставку или мне нужно использовать пасту? Как это сделать в любом случае?
Ваш XML не является корректным. Существует '<' missing ni ваш вход. Хотя общий вопрос очень хороший, пожалуйста, по-прежнему убедитесь, что вы публикуете действительный код и XML (если не задан вопрос «почему это не компилируется»). Благодарю. :) – simbabque
@simbabque Я пропустил «<», возможно, при написании этого вопроса, мой оригинальный файл в порядке :) все еще ищут ответ, хотя я пробовал много вещей, которые не работали. – user3649361
Вы хотите, чтобы я объяснил, почему ваша вторая попытка не делает то, что вы хотите? – simbabque