我想使用 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";
我的问题是如何分隔每个名称属性(类别/事件/ @ 名称),以便我可以对我解析的每个值执行测试。目前我只是得到一个充满解析数据的大字符串,而我想要几个可以测试的小字符串。我怎样才能做到这一点?谢谢: - )
答案 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;
}
答案 1 :(得分:7)
find
方法返回XML::XPath::NodeSet
对象,该对象是找到的所有节点的集合。我无法想象你能看到一个包含所有属性值的长字符串。
检索完一组节点后,您可以使用size
,get_node
和get_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