使用XML替换节点:LibXML

问题描述 投票:0回答:1

我正在尝试使用来自用户输入的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>也被删除。

perl xml-libxml
1个回答
1
投票

如果您可以将代码作为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>
© www.soinside.com 2019 - 2024. All rights reserved.