/ / Jak dodać nowy węzeł do NodeList przy użyciu Perl (XML :: LibXML) - xml, perl, libxml2

Jak dodać nowy węzeł do NodeList przy użyciu Perl (XML :: LibXML) - xml, perl, libxml2

Próbuję dodać nowy węzeł do istniejącego dokumentu XML.

Jednak próbuje użyć funkcji push w XML :: LibXML :: NodeList wynik nie zmienia dokumentu.

Oto przykład:

#!/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);

Odpowiedzi:

4 dla odpowiedzi № 1

Aby wstawić nowy węzeł do dokumentu, użyj

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

1 dla odpowiedzi nr 2

Należy pamiętać, że XML jest strukturą danych opartą na drzewie. XML::LibXML to parser libxml2 do konstruowania struktury danych drzewa z danych XML. XML::LibXML::NodeList to LISTA węzłów spełniających twoje kryteria wyszukiwania. Dodanie nowego węzła do tej listy nie spowoduje żadnych zmian w kodzie XML.

Aby dodać nowy węzeł, najpierw znajdź węzeł od swojej nodelisty i wywołaj odpowiedni podrzędny

appendChild
addChild
addSibling

i wiele więcej. Mam nadzieję, że to ci pomoże.


0 dla odpowiedzi № 3

Szybki przegląd The Fine Manual pozwala mi sądzić, że powinieneś używać tego Interfejs DOM, nie push i pop (które nie robią nic więcej niż modyfikowanie listy, a nie ukryty DOM, jak się dowiedziałeś).