Warum kann ich nicht auf Elemente in einer XML-Datei mit XPath in XML :: LibXML?
-
21-09-2019 - |
Frage
Ich habe eine XML-Datei, ein Teil davon sieht wie folgt aus:
<wave waveID="1">
<well wellID="1" wellName="A1">
<oneDataSet>
<rawData>0.1123975676</rawData>
</oneDataSet>
</well>
... more wellID's and rawData continues here...
Ich versuche, die Datei mit Perl libXML und Ausgabe der wellName und der rawData mit dem folgenden zu analysieren:
use XML::LibXML;
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file('/Users/johncumbers/Temp/1_12-18-09-111823.orig.xml');
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('ns', 'http://moleculardevices.com/microplateML');
my @n = $xc->findnodes('//ns:wave[@waveID="1"]'); #xc is xpathContent
# should find a tree from the node representing everything beneath the waveID 1
foreach $nod (@n) {
my @c = $nod->findnodes('//rawData'); #element inside the tree.
print @c;
}
Es druckt nichts im Augenblick und ich glaube, ich habe ein Problem mit meinen XPath-Anweisungen. Bitte können Sie mir helfen, es zu beheben, oder können Sie mir zeigen, wie man Ärger zu schießen die XPath-Anweisungen? Danke.
Lösung
Anstelle der Verwendung von findnodes
in der Schleife, verwendet getElementsByTagName () :
my @c = $nod->getElementsByTagName('rawData');
Hier sind einige andere praktische Methoden zur Verwendung Verarbeitung @c
Array:
$c[0]->toString; # <rawData>0.1123975676</rawData>
$c[0]->nodeName; # rawData
$c[0]->textContent; # 0.1123975676
Andere Tipps
Wenn die ‚Welle‘ Element in einem Namensraum ist dann die ‚rawData‘ Element ist auch, so dass Sie wahrscheinlich verwenden müssen
foreach $nod (@n) {
my @c = $xc->findnodes('descendant::ns:rawData', $nod); #element inside the tree.
print @c;
}