Perl如何解析XML文件,xpath

12

我想使用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";
我的问题是如何分离每个name属性(category/event/@name),以便我可以对解析出的每个值执行测试。目前,我只得到了一个包含解析数据的大字符串,而我希望得到几个小字符串,以便我可以测试。我该怎么做?谢谢 :-)
2个回答

20

3
你是推荐使用XML::LibXML是因为你更熟悉它,还是因为你认为它比XML::XPath更有优势?就我所知,后者也能正常工作。而且它是纯Perl编写的,这使得它比LibXML更慢,但可以在不借助外部库的情况下使用。 - Borodin
3
那是一个超链接,点击它跳转。 - daxim
@daxim 感谢您的回复。我尝试了那个方法,它可以工作,但不完全是我想要的方式。我的输出是 name="attribute_value",但我只想要 attribute_value。有没有办法只输出 attribute_value 而不带 name=""? - liverpaul
1
经过更多的研究,我发现将行 ´$node->toString´ 更改为 ´$node->to_literal´ 可以让我输出仅带有属性值而不带有 name=""。这正是我想要的。如果这种方法不好,请告诉我,否则我的问题就得到了解答。再次感谢您的帮助 :-) - liverpaul

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

谢谢您的回复。在读了daxim发布的链接后,我决定使用XML::LibXML。它似乎是最好的选择,所以作为一个初学者,我认为学习一种更好文档化的模块会更好。感谢您撰写的介绍信息,它帮助我更好地理解事情 :-) - liverpaul
使用 XML::XPath,我们可以在路径中使用 ^* 吗? 例如:my $names = $xp->find('/category/eve*');。在 category 中搜索以 eve 开头的标签。 - Venkatesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接