Es ist klar, dass das nicht funktionieren kann, allerdings ist es vielleicht nicht offensichtlich. Das Problem hängt damit zusammen, dass Perl und die Methode
findnodes der Klasse
XML::LibXML::Node kontextsensitiv sind. In der Dokumentation der Methode steht
Quote[...]
findnodes evaluates the xpath expression (XPath 1.0) on the current node and returns the resulting node set as an array. In a scalar context returns a XML::LibXML::NodeList object.
[...]
Ob man um die Variable in der Deklaration Klammern setzt oder nicht macht nun aber genau den Unterschied, dass man den Typ des Kontexts verändert in dem der zuzuweisende Ausdruck ausgewertet wird:
- Schreibt man
my ($node) = $doc->findnodes($query);
so wird der Aufruf von findnodes im Listenkontext ausgewertet und die Listenelemente werden den auf der linken Seite deklarierten Variablen zugewiesen — in $node landet also der erste auf den XPath-Ausdruck $query passende XML-Knoten unterhalb von $doc, oder aber undef falls überhaupt kein Knoten gefunden wurde. - Schreibt man
my $node = $doc->findnodes($query);
so wird der Aufruf von findnodes im Skalarkontext ausgewertet, so dass in $node kein Objekt des Typs XML::LibXML::Node sondern eines des Typs XML::LibXML::NodeList landet und diese Klasse unterstützt, wie die Fehlermeldung schon sagt, die Methode setData nicht.
When C++ is your hammer, every problem looks like your thumb.