Perl XML::LibXML: findnode vs. findvalue vs. finden - was ist der Unterschied?
Ich bin mit XML::LibXML
, und das brauche ich einfach, um die Anzahl der Knoten angegeben, die durch einen XPath-Ausdruck.
Unter Verwendung entweder der ersten beiden code-Zeilen unten ergibt das, was ich Suche. Ich kann die count
XPath-Funktion, die entweder mit findvalue
oder find
aber nicht findnodes
(ja, ich weiß, da gibt es eine Liste).
my $node_cnt = $dom->findvalue("count($xpath_str)"); # WORKS!
my $node_cnt = $dom->find("count($xpath_str)"); # WORKS!
my @node_cnt = $dom->findnodes("count($xpath_str)"); # count doesn't work!
Das führt mich zu einer Allgemeinen quälende Frage:
Was ist der Unterschied zwischen den drei find
Typen? In der Dokumentation heißt es:
$string = $node->findvalue($xpath)
$result = $node->find($xpath)
@nodes = $node->findnodes($xpath_expression)
-
Es ist wirklich ein Unterschied zwischen argument
$xpath_expression
vs. nur$xpath
in der Dokumentation? -
Für die beiden Rückkehr ein Skalar, was ist der Unterschied?
Ich versuche zu verstehen, die Bedeutung der Verwendung, eine Art über die andere - danke!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Unterschied ist die Art von Wert, dass die Methoden zurück.
findnodes
wird verwendet, um eine Liste von Knoten. Wenn die Methode aufgerufen wird, in der Listen-Kontext, dann gibt es eine Liste von Objekten des entsprechenden Typs, wieXML::LibXML::Element
,XML::LibXML::Text
etc. Wenn es heißt im skalaren Kontext, dann gibt es eine einzigeXML::LibXML::NodeList
- Objekt, das die gleichen Informationen enthält.Es nicht verwendet werden, um wieder ein beliebiger Ausdruck, so zum Beispiel
$dom->findnodes('42')
wird nichts zurück. Sie können immer nur eine Liste Dokument-nodes, die von dieser Methode.findvalue
wird verwendet, um wieder einen einzelnen text oder numerische Wert, also nicht um ein XML-Knoten. Wenn Sie einen XPath-Ausdruck evaluiert zu einer Liste von Knoten konvertiert dann diese Liste, um text durch Verkettung aller Textknoten innerhalb eines der Knoten in der Liste.find
können, etwas zurückzugeben. Wird es wieder eine Liste von Knoten alsXML::LibXML::NodeList
- Objekt wird ein numerischer Wert als eineXML::LibXML::Number
Objekt, ein string-literal alsXML::LibXML::Literal
Objekt etc. Im Gegensatz zufindnodes
es immer gibt einen einzelnen skalaren Wert, auch wenn es in der Liste Kontext.Habe ich noch nie gewählt
find
. Es sieht aus wie es ist gedacht als ein catch-all, wenn Sie nicht wissen, welche Art von Ergebnis zu erwarten.Zum Beispiel, würden Sie wahrscheinlich wollen zu schreiben
my $nrecs = $dom->findvalue('count(/root/record)')
um die Anzahl der Datensätze innerhalb des root-Elements.$nrecs
wäre ein einfaches perl numerischen Wert.Auf der anderen Seite, um eine Liste die Datensätze, die Sie verwenden würden
my @records = $dom->findnodes('/root/record')
. Jetzt@records
enthält eine Reihe vonXML::LibXML::Element
Objekte.In Ihre Beispiele,
diese Sätze
$node_cnt
zu einem einfachen Perl-Nummer, während diesersetzt
$node_cnt
zu einemXML::LibXML::Number
Objekt, das geschieht stringify (beim drucken), um die gleiche wie die Vorherige Anweisung. Beweisen Sie diese für sich selbst durch den Druckprint ref $node_cnt
in beiden Fällen.Dann
fehl, weil der XPath -
count
zu einer Zahl ausgewertet wird, und nicht ein XML-Knoten (es ist nicht Teil der XML-Struktur). Es gibt keine Möglichkeit der Umwandlung von zahlen von Knoten, so ist das Ergebnis eine leere Liste. Wenn es andersherum wäre, und wir hatten unsfindvalue
auf einen Ausdruck, der ausgewertet, um eine Liste von Knoten, dann gibt es eine vage Möglichkeit zur sinnvollen Umwandlung in einen text-Wert undfindvalue
tut sein bestes und gibt die Verkettung aller Textknoten, die durch den Knoten in der Liste.