2011-03-11 39 views
4

我正在寻找可能的最简单的方法,使用Perl中的XPath查询从XML结构中快速检索数据。在Perl中执行XPath查询XML数据的最简单方法是什么?

下面的代码结构说明想什么,我来实现:

my $xml_data = "<foo><elementName>data_to_retrieve</elementName></foo>"; 
my $xpath_query = "//elementName"; 
my $result_of_query = ... what goes here? ... 
die unless ($result_of_query eq 'data_to_retrieve'); 

显然TIMTOWTDI适用,但什么是做到这一点的最简单的方法?

回答

14

XML :: LibXML并不容易,但是在所有其他方面都能跳动XML :: XPath。

use XML::LibXML; 
my $xml_data = XML::LibXML->load_xml(
    string => '<foo><elementName>data_to_retrieve</elementName></foo>' 
); 
die unless 'data_to_retrieve' eq 
    $xml_data 
     ->findnodes('//elementName') 
     ->get_node(1) 
     ->textContent; 
+4

确实。它速度非常快,它有一个非常干净的API,它处理所有的XPath,处理命名空间和其他所有你想要的东西等等等等等等。 – ikegami 2011-03-11 18:55:41

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

my $xp = XML::XPath->new(xml => $xml_data); 

my $result_of_query = $xp->find('//elementName'); # find all nodes that match 

foreach my $node ($result_of_query->get_nodelist) { 
     #Do someting 
} 
+0

是的。 XML :: XPath是要走的路。 – friedo 2011-03-11 16:51:14

+8

我不会调用XML :: XPath。这是旧的,并没有真正维护。 XML :: LibXML通常被认为是更好的选择,请参阅http://perl-xml.sourceforge.net/faq/#cpan_modules上的Perl XML常见问题或http://www.socialtext.net/perl5/上的Perl 5 Wiki recommended_xml_modules – mirod 2011-03-11 18:12:34

相关问题