2012-04-12 20 views
5

I m przy użyciu kodu poniżej, aby uzyskać wartość węzła z pliku XML:Get wartości węzła przy użyciu modułu XML :: XPath w Perlu

use XML::XPath; 
use XML::XPath::XMLParser; 

my $pt1 = XML::XPath->new(filename => 'test1.xml'); 

my $nodeset = $pt1->find('/file1/table/tname'); 

foreach my $node ($nodeset->get_nodelist) 
{ 
    print $node->getNodeValue."\n"; 
} 

Zawartość „test1.xml” jest jak poniżej:

<file1> 
    <table> 
     <tname>_sys_ident</tname> 
     <ttype>regular</ttype> 
     <col> 
      <name>_sys_ident_asp</name> 
      <type>varchar(16)</type> 
      <fkey>_sys_asp</fkey> 
      <attr>PRIMARY KEY</attr> 
     </col> 
    </table> 
</file1> 

Chcę drukować wartość tname (tj _sys_ident). Ale powyższy kod nie drukuje niczego.

Jeśli używam następujący wewnątrz pętli for:

print XML::XPath::XMLParser::as_string($node); 

wtedy, daje następujące dane wyjściowe:

<tname>_sys_ident_asp</tname> 

Nie chcę tego pełną nazwę węzła i wartość ciągu. Po prostu chcę wartość węzła. Po raz pierwszy próbuję XML i XPath. Proszę powiedz mi, co robię źle.

Odpowiedz

7

getNodeValue jest dla węzłów attribute. Dla elements, chcesz metodę string_value:

foreach my $node ($nodeset->get_nodelist) 
{ 
    print $node->string_value."\n"; 
} 
+0

Dzięki. Doskonała odpowiedź. – AnonGeek

+0

Co robi '$ nodeset-> get_nodelist'? – alex

+0

@alex, [przeczytaj dokumentację] (https://metacpan.org/pod/XML::XPath::NodeSet#get_nodelist()) – cjm

1

Dla Twojej XPath, try/plik1/table/tname/text()

+0

W ten sposób zostaniesz poproszony o wprowadzenie "funkcji" ... (wpisanie czegokolwiek tutaj powoduje wykonanie polecenia xpath, a musisz ponownie uruchomić sesję bash, aby odzyskać "prawdziwe" polecenie xpath) –

Powiązane problemy