xml - 将新节点添加到一组现有节点 (Perl XML::LibXML)

标签 xml perl libxml2

使用 Perl XML::LibXML 库,我尝试使用循环向 XML 文档中的一组现有节点中的每一个添加一个新节点。这是我迄今为止的尝试:

#!/usr/bin/perl -w
use 5.14.2;
use XML::LibXML;

my $filename = "xml_doc.xml";
my $parser = XML::LibXML->new();
$parser->keep_blanks(0);
my $dom = $parser->parse_file($filename);

for my $node ($dom->findnodes("/poem/stanza/v"))
{
    my $elm = $dom->createElement('newnode');
    $elm->appendText('This is a new node');
    $_->addChild($elm);
}

say $dom->toString(1);

文件“xml_doc.xml”:

<?xml version="1.0" encoding="UTF-8"?>
<poem>
<stanza>
<v>As I was going to Bonner,</v>
<v>Upon my word of honor,</v>
<v>I met a pig</v>
<v>Without a wig,</v>
<v>As I was going to Bonner.</v>
</stanza>
</poem>

程序失败,并出现错误“无法对 batch_add_nodes.pl 第 16 行的未定义值调用方法“addChild”。”

欢迎任何提示。

最佳答案

您需要决定您的 for 循环迭代器变量是 $node 还是 $_ :-)

如果我将 $_->addChild($elm) 替换为 $node->addChild($elm) 您的代码将正常工作并给出以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<poem>
  <stanza>
    <v>As I was going to Bonner,<newnode>This is a new node</newnode></v>
    <v>Upon my word of honor,<newnode>This is a new node</newnode></v>
    <v>I met a pig<newnode>This is a new node</newnode></v>
    <v>Without a wig,<newnode>This is a new node</newnode></v>
    <v>As I was going to Bonner.<newnode>This is a new node</newnode></v>
  </stanza>
</poem>

关于xml - 将新节点添加到一组现有节点 (Perl XML::LibXML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47871738/

相关文章:

perl - 如何在运行时将现有的Moose角色组成一个类?

php/simplexml - LIBXML 选项被忽略?

iphone - GDataXML/Libxml2 XPath concat 不起作用

xml - 如何使用 XQuery 组合多个 XML 文件

perl - 如何确定脚本是在系统中执行还是在 Perl 中的 qx 调用中执行?

c# - 实时系统中的MSMQ

linux - perl one liner + 如何在 perl line liner 上给出标准输出

ruby - 验证 XML : No matching global declaration available for the validation root

python - 如何通过XML解析并使用Python转换为CSV

c# - XMLReader 返回 "\n "而不是值