2012-01-04 4 views
1

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

Однако попытка использовать функцию 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); 
+0

Не ссылайтесь на точный [URL-адрес пользователя/версии] (http://search.cpan.org/~shlomif/XML-LibXML-1.89/lib/XML/LibXML/NodeList.pm). Вместо этого используйте одну из констант [search.cpan.org/perldoc/...](http://search.cpan.org/perldoc/XML::LibXML::NodeList) [metacpan.org/module/... ] (http://metacpan.org/module/XML::LibXML::NodeList) [p3rl.org] (http://p3rl.org/XML::LibXML::NodeList). (Если вам не нужна конкретная версия) –

+0

Спасибо за комментарий! Исправлена. – HerbSpiral

ответ

4

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

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

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

1

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

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

appendChild 
addChild 
addSibling 

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

Смежные вопросы