Как добавить новый узел в NodeList с помощью Perl (XML :: LibXML) - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь добавить новый узел в существующий документ XML.

Однако при попытке использовать функцию push в результате 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 ]

4 голосов
/ 04 января 2012

Чтобы вставить новый узел в документ, используйте

$category_nodelist->[0]->appendChild($book_el);
1 голос
/ 05 января 2012

Обратите внимание, что XML - это структура данных на основе TREE. XML::LibXML - это синтаксический анализатор libxml2 для построения древовидной структуры данных из данных XML. XML::LibXML::NodeList - СПИСОК узлов, соответствующих вашим критериям поиска. Таким образом, добавление нового узла в этот список не внесет никаких изменений в XML.

Чтобы добавить новый узел, сначала найдите узел в вашем списке узлов и вызовите подходящий суб

appendChild
addChild
addSibling

и многое другое. Надеюсь, это поможет вам.

0 голосов
/ 04 января 2012

Быстрое изучение The Fine Manual заставляет меня подумать, что вы должны использовать интерфейс DOM , а не push и pop (которые не делают ничего, кроме изменения списка, а не базового DOM, как вы нашливыход).

...