liv*_*aul 11 perl xpath xml-parsing
我想使用Perl解析XML文件.我能够使用XML :: Simple模块完成它,但现在我想开始使用XML :: XPath模块,因为它使用XPath表达式.根据我有限的知识,我认为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";
Run Code Online (Sandbox Code Playgroud)
我的问题是如何分隔每个名称属性(类别/事件/ @ 名称),以便我可以对我解析的每个值执行测试.目前我只是得到一个充满解析数据的大字符串,而我想要几个可以测试的小字符串.我怎样才能做到这一点?谢谢 :-)
dax*_*xim 19
该评论指出XML::XPath自2003年以来尚未更新,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;
}
Run Code Online (Sandbox Code Playgroud)
见XML::LibXML::Parser和XML::LibXML::Node.
该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>
Run Code Online (Sandbox Code Playgroud)
OUTPUT
cat1
cat2
cat3
cat4
cat5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18965 次 |
| 最近记录: |