我正在尝试使用来自用户输入的XML:LibXML
文件解析器替换XML中的某些节点值。
示例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);
当前,我的代码正在运行,但是当我尝试替换Node b内容时,它以某种方式从xml中删除了</a>
。并且,当尝试替换节点c时,</a>
和</b>
也被删除。
如果您可以将代码作为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>