perl, libxml xpath : wie man ein element über ein Attribut in diesem Beispiel .xml-Datei
Ich würde gerne Ihre Hilfe in den folgenden :
gegeben .xml-Datei :
<network>
<netelement>
<node pwd="KOR-ASBG" func="describe_SBG_TGC">
<collection category="IMT" dir="Stream_statistics"></collection>
</node>
</netelement>
<netelement>
<node pwd="ADR-ASBG" func="describe_SBG_TGC">
<collection category="IMT" dir="Stream_statistics"></collection>
<collection category="IMT" dir="Proxy_registrar_statistics_ACCESS"></collection>
</node>
</netelement></network>
Was ich möchte zu tun ist, um das element mit dem Attribut "KOR-ASBG", zum Beispiel,
aber nur mithilfe von XPath.
Ich geschrieben habe das folgende Perl-code :
#!/usr/bin/perl -w
use strict ;
use warnings ;
use XML::LibXML ;
use Data::Dump qw(dump) ;
my $dump = "/some_path/_NETELEMENT_.xml" ;
my $parser = new XML::LibXML ; my $doc ;
eval{ $doc = $parser->parse_file($dump) ; } ;
if( !$doc ) { print "failed to parse $dump" ; next ; }
my $root = $doc->getDocumentElement ;
my $_demo = $root->find('/network/netelement/node[@pwd="KOR-ASBG"]') ;
print dump($_demo)."\n" ;
Aber, was es bekommt dispalyed ist :
bless([bless(do{\(my $o = 155172440)}, "XML::LibXML::Element")], "XML::LibXML::NodeList")
Also die Frage wäre, wie bekomme ich die XML-Elements mit dem "pwd" - Attribut (entspricht "KOR-ASBG"), die Verwendung von XPath ?
Danke 🙂
PS. Ich habe auch versucht :
my @_demo = $root->findnodes('/network/netelement/node[@pwd="KOR-ASBG"]') ;
print dump(@_demo)."\n" ;
und was wird es angezeigt wird :
bless(do{\(my $o = 179552448)}, "XML::LibXML::Element")
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre dumper-Objekt ist nicht an Euch liegen; Sie werden immer eine Liste von Knoten. Um darauf zuzugreifen, können Sie entweder Durchlaufen oder einfach nur den Zugriff auf den ersten Knoten:
Natürlich alle DOM-Methoden, stehen Ihnen zur Verfügung, sobald Sie die eigentliche Knoten:
Könnte es technisch mehr als einem element übereinstimmt, das ist, warum ein ResultSet zurückgegeben wird, anstatt von einzelnen Knoten. Könnten Sie
Dass das erste match in $ele.
$ele
?) Versuchen Sie es erneut. Sie sollten immerbless(do{\(my $o = 999999)}, "XML::LibXML::Element")
Was Sie sehen, ist, was Sie nennen, in Perl eine "undurchsichtige Objekt". Es ist kein hash, sondern eine Taste, um eine Reihe von lexikalischen hashes in der das Paket, das halten, die Felder für alle Instanzen. Es ist Perl die Möglichkeit der Implementierung von Objekten mit Sicherheit. Der einzige Weg, um an Informationen zu nennen, deren get-Accessoren.
Den Weg, um herauszufinden, wie mit diesen umzugehen ist Hinweis das zweite argument der
bless
und sich diese:http://search.cpan.org/perldoc?<name-of-package>
Oder in deinem Fall: http://search.cpan.org/perldoc?XML::LibXML::NodeList und
http://search.cpan.org/perldoc?XML::LibXML::Element
Nun, ich weiß nicht empfehlen diese in allen Fällen, aber wenn Sie bemerken, die NodeList-Objekt ist ein gesegnetes array Referenz. So konnte man nur Zugriff auf die letzten Knoten, etwa so:
Natürlich macht es oft Sinn, eine Liste-Implementierung verhält sich wie ein array, entweder durch die selige array oder das überladen von Operatoren oder
tie
s. Also, in diesem Fall, glaube ich nicht, es ist zu groß, eine Verletzung der Kapselung.