Perl,如何解析XML文件,xpath

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::ParserXML::LibXML::Node.

  • 你推荐`XML :: LibXML`是因为你更了解它,还是因为你认为它比`XML :: XPath'有真正的优势?据我所知,后者工作正常.它也是纯Perl,它使它比LibXML慢,但可以在没有外部库的帮助下使用. (3认同)
  • 这是一个超链接.遵循它. (3认同)

Bor*_*din 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>
Run Code Online (Sandbox Code Playgroud)

OUTPUT

cat1
cat2
cat3
cat4
cat5
Run Code Online (Sandbox Code Playgroud)