Замените узел, используя XML: LibXML - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь заменить значение некоторых узлов в XML, используя анализатор файлов XML:LibXML из пользовательского ввода.

Пример XML:

<header>
   <id x_id="1">
      <a>NA</a>
      <b>NA</b>
      <c>NA</c>
   </id>
</header>

Код:

use strict;
use warnings;
use XML::LibXML;

print "Please specify node b content\n";
my $node_b = <STDIN>;
chomp $node_b;

my $template = "xx.xml";
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($template);
my($object0) = $doc->findnodes("/header/id/b/text()");
my $text0 = XML::LibXML::Text->new($node_b);
$object0->replaceNode($text0);

В настоящее время мой код работает, но он каким-то образом удалил </a> из xml, когда Я пытался заменить Node B контента. И, при попытке заменить узел c, </a> и </b> также были удалены.

1 Ответ

1 голос
/ 13 апреля 2020

Было бы проще, если бы вы могли предоставить свой код в виде MCVE , чтобы другие могли просто скопировать и запустить.

Тем не менее, это работает для меня:

use strict;
use warnings;
use XML::LibXML;

my $doc = XML::LibXML->load_xml(string => <<'XML');
<header>
   <id x_id="1">
      <a>A</a>
      <b>B</b>
      <c>C</c>
   </id>
</header>
XML

my ($object0) = $doc->findnodes("/header/id/b");
if ($object0) {
   $object0->replaceNode(XML::LibXML::Text->new("replaced"));
}
else {
   ($object0) = $doc->findnodes("/header/id/b");
   my $node = XML::LibXML::Element->new("B");
   $node->addChild(XML::LibXML::Text->new("new text"));
   $object0->replaceNode($node);
}
print STDERR "$doc\n";

Он печатает

<?xml version="1.0"?>
<header>
   <id x_id="1">
      <a>A</a>
      <b>replaced</b>
      <c>C</c>
   </id>
</header>
...