如何使用Perl(XML :: LibXML)向NodeList添加新节点

时间:2012-01-04 17:04:47

标签: xml perl libxml2

我正在尝试向现有XML文档添加新节点。

但是,尝试在XML::LibXML::NodeList结果中使用推送功能不会更改文档。

以下是一个例子:

#!/usr/bin/perl 
use strict;
use XML::LibXML;

my $parser     = XML::LibXML->new();
my $xml_string =
'<example>
    <books>
        <category id="1">
            <book isbn="a" />
            <book isbn="b" />
            <book isbn="c" />
        </category>
        <category id="2"/>
        <category id="3"/>
    </books>
</example>';
my $doc = $parser->parse_string($xml_string);
my $category_nodelist = $doc->findnodes('//category[@id="1"]');

my $book_el = $doc->ownerDocument->createElement('book');
$book_el->setAttribute("isbn", "d");
$category_nodelist->push($book_el);

print $doc->toString(1);

3 个答案:

答案 0 :(得分:4)

要将新节点插入文档,请使用

$category_nodelist->[0]->appendChild($book_el);

答案 1 :(得分:1)

请注意,XML是基于TREE的数据结构。 XML::LibXML是一个libxml2解析器,用于根据XML数据构造树数据结构。  XML::LibXML::NodeList是符合搜索条件的节点列表。因此,向此列表添加新节点不会对XML进行任何更改。

要添加新节点,首先要从节点列表中找到节点并调用合适的子

appendChild
addChild
addSibling

还有更多。希望这对你有所帮助。

答案 2 :(得分:0)

快速阅读精细手册让我觉得你应该使用DOM interface,而不是推送和弹出(除了修改列表,而不是你发现的底层DOM)。