Perl,如何解析XML文件,xpath

Perl,如何解析XML文件,xpath,perl,xpath,xml-parsing,Perl,Xpath,Xml Parsing,我想使用Perl解析XML文件。我可以使用XML::Simple模块来完成,但是现在我想开始使用XML::XPath模块,因为它使用XPath表达式。根据我有限的知识,我认为XPath将使未来的解析更容易,对吗? 以下是我到目前为止的Perl代码: use strict; use warnings; use XML::XPath; my $file = "data.xml"; my $path = XML::XPath->new(filename => $file); my $n

我想使用Perl解析XML文件。我可以使用XML::Simple模块来完成,但是现在我想开始使用XML::XPath模块,因为它使用XPath表达式。根据我有限的知识,我认为XPath将使未来的解析更容易,对吗? 以下是我到目前为止的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";
我的问题是如何分离每个名称属性(category/event/@name),以便对解析的每个值执行测试。目前,我只是得到一个大字符串,其中包含解析后的数据,而我需要几个小字符串,可以进行测试。我该怎么做?谢谢:-)

指出自2003年以来没有更新过,建议改为


请参阅和。

查找方法返回一个对象,该对象是找到的所有节点的集合。我无法想象你能做什么来看到一个包含所有属性值的长字符串

检索完节点集后,可以使用
size
get\u node
get\u nodelist
等方法处理其内容(请参阅我上面链接的文档)
get_nodelist
将返回一个Perl列表,在本例中,对象也有自己的方法。这个计划应该会让你开始

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>

您推荐
XML::LibXML
是因为您更了解它,还是因为您认为它比
XML::XPath
有真正的优势?据我所知,后者很好用。它也是纯Perl,这使得它比LibXML慢,但无需外部库的帮助就可以使用。一定要跟着做。@daxim谢谢你的回复。我试着让它工作,但不是100%我想要的方式。我的输出是name=“attribute\u value”,但我只想要attribute\u value。有没有一种方法可以只输出不带名称“”的属性_值?经过进一步的研究,我发现将行´$node->toString`更改为´$node->to_literal'只会输出不带名称“”的属性_值。这就是我想要的。如果这是一种糟糕的做事方式,请告诉我,否则我的问题就会得到回答。再次感谢您的帮助:-)不,将文档化方法
调用为\u literal
不是一件坏事谢谢你的回复。在阅读了daxim发布的链接后,我决定改用XML::LibXML。这似乎是最好的一个了,所以作为一个初学者,我认为我最好学习一个模块,更好地记录。我很感谢你写的介绍信息,它帮助我更好地理解了事情:-)使用
XML::XPath
,我们可以使用
^
*
内部路径吗?。例如:
my$names=$xp->find('/category/eve*')
。在
类别
中,搜索以
eve开头的标签
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