Как добавить новый узел в NodeList с помощью Perl (XML :: LibXML)

Я пытаюсь добавить новый узел в существующий документ 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">
 </book></book></book></category>
 <category id="2">
 <category id="3">
 </category></category></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 ответа

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

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


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

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

appendChild
addChild
addSibling

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


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

licensed under cc by-sa 3.0 with attribution.