Perl,如何解析XML文件,xpath

时间:2012-03-11 00:04:17

标签: perl xpath xml-parsing

我想使用 Perl 解析XML文件。我能够使用 XML :: Simple 模块完成它,但现在我想开始使用 XML :: XPath 模块,因为它使用 XPath < / strong>表达式。根据我有限的知识,我认为XPaths将使未来的解析变得更容易,对吧? 这是我到目前为止的Perl代码:

use strict;
use warnings;
use XML::XPath;

my $file = "data.xml";
my $path = XML::XPath->new(filename => $file);

my $name = $path->find('/category/event/@name');
print $name."\n";

我的问题是如何分隔每个名称属性(类别/事件/ @ 名称),以便我可以对我解析的每个值执行测试。目前我只是得到一个充满解析数据的大字符串,而我想要几个可以测试的小字符串。我怎样才能做到这一点?谢谢: - )

2 个答案:

答案 0 :(得分:19)

This review指出自2003年以来XML::XPath尚未更新,建议改为XML::LibXML

use 5.010;
use strict;
use warnings;
use XML::LibXML;

my $dom = XML::LibXML->new->parse_file('data.xml');
for my $node ($dom->findnodes('/category/event/@name')) {
    say $node->toString;
}

请参阅XML::LibXML::ParserXML::LibXML::Node

答案 1 :(得分:7)

find方法返回XML::XPath::NodeSet对象,该对象是找到的所有节点的集合。我无法想象你能看到一个包含所有属性值的长字符串。

检索完一组节点后,您可以使用sizeget_nodeget_nodelist等方法处理其内容(请参阅上面链接的文档)。 get_nodelist将返回一个Perl列表,在这种情况下,XML::XPath::Node::Attribute对象也有自己的方法。这个程序应该让你入门

use strict;
use warnings;

use XML::XPath;

my $xp = XML::XPath->new(ioref => \*DATA);

my $names = $xp->find('/category/event/@name');

for my $node ($names->get_nodelist) {
  say $node->getNodeValue;
}


__DATA__
  <category name="a">
    <event name="cat1" />  
    <event name="cat2" />  
    <event name="cat3" />  
    <event name="cat4" />  
    <event name="cat5" />  
  </category>

<强>输出

cat1
cat2
cat3
cat4
cat5