Thread Nochmal XML -.- (4 answers)
Opened by Nordlicht at 2010-10-15 01:06

murphy
 2010-10-15 01:32
#141909 #141909
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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
    Code (perl): (dl )
    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
    Code (perl): (dl )
    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.

View full thread Nochmal XML -.-