具有以下代码:
#!/usr/bin/env perl
use 5.014;
use warnings;
use XML::Twig;
my $twig = XML::Twig->parse( \*DATA );
$twig->set_pretty_print('indented_a');
# 1st search
# this prints OK the all <files> nodes where the <type> == 'release'
$_->print for ( $twig->findnodes( '//type[string()="release"]/..' ) );
# 2nd search
# try to get first matched only
my $latest = $twig->findnodes( '(//type[string()="release"])[1]/..' );
$latest->print;
__DATA__
<root>
<files>
<type>beta</type>
<ver>3.0</ver>
</files>
<files>
<type>alpha</type>
<ver>3.0</ver>
</files>
<files>
<type>release</type>
<ver>2.0</ver>
</files>
<files>
<type>release</type>
<ver>1.0</ver>
</files>
</root>
上面的版画
<files>
<type>release</type>
<ver>2.0</ver>
</files>
<files>
<type>release</type>
<ver>1.0</ver>
</files>
error in xpath expression (//type[string()="release"])[1]/.. around (//type[string()="release"])[1]/.. at /opt/anyenv/envs/plenv/versions/5.24.0/lib/perl5/site_perl/5.24.0/XML/Twig.pm line 3648.
第二次搜索的通缉输出
<files>
<type>release</type>
<ver>2.0</ver>
</files>
例如,第一个<files>
节点<type> eq 'release'
。
根据这个答案,使用的XPath表达式(//type[string()="release"])[1]/..'
应该可以工作,但是似乎我又错过了一些重要的事情。
有人可以帮忙吗?
XML::Twig
不支持完整的XPath语法。该get_xpath
方法的文档(与相同findnodes
)说明了这一点
涵盖了XPATH缩写语法的一个子集:
tag tag[1] (or any other positive number) tag[last()] tag[@att] (the attribute exists for the element) tag[@att="val"] tag[@att=~ /regexp/] tag[att1="val1" and att2="val2"] tag[att1="val1" or att2="val2"] tag[string()="toto"] (returns tag elements which text (as per the text method) is toto) tag[string()=~/regexp/] (returns tag elements which text (as per the text method) matches regexp) expressions can start with / (search starts at the document root) expressions can start with . (search starts at the current element) // can be used to get all descendants instead of just direct children * matches any tag
因此,不支持括号内的子表达式,并且您只能指定一个谓词
同样重要的是,在标量上下文中,findnodes
将仅返回找到的节点数量的计数。您必须在列表上下文中使用它来检索节点本身,这意味着查找第一个匹配元素的更简单方法是编写
my ($latest) = $twig->findnodes( '//type[string()="release"]/..' );
哪个很好
如果您确实需要XPath的全部功能,则可以使用XPath XML::Twig::XPath
。此模块通过重载使用XML::XPath
或优秀XML::XPathEngine
提供完整的XPath语法findnodes
。(其他方法get_xpath
并find_nodes
继续使用减少的XML::Twig
变化。)
findnodes
在标量上下文中,现在返回一个XML::XPathEngine::NodeSet
对象,该对象的数组索引已过载。所以你可以写
my $latest = $twig->findnodes( '//type[string()="release"]/..' );
$latest->[0]->print;
要不就
my ($latest) = $twig->findnodes( '//type[string()="release"]/..' );
如上。
最后,我希望/root/files[type[string()="release"]]
优先查看结尾的parent::node()
,但这纯粹是个人的
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句