XML::Twig::XPath调用findnodes方法仍报错:提示需使用findnodes而非get_xpath的技术问题
问题分析与解决方案
我刚帮你排查了这个问题,核心原因其实很容易被忽略:你虽然加载了XML::Twig::XPath模块,但创建Twig对象时仍然用的是XML::Twig的构造函数,导致你的对象本质还是XML::Twig实例,并没有继承XML::Twig::XPath提供的完整XPath支持能力。
从报错栈里能清晰看到这一点:最终调用的是XML::Twig::get_xpath方法,而不是XML::Twig::XPath实现的findnodes——因为普通XML::Twig的findnodes其实是get_xpath的别名,它并不支持你用的//info_string[text()]这类复杂XPath表达式。
解决步骤
只需要修改对象创建的代码,用XML::Twig::XPath的构造函数来初始化对象即可:
#!/usr/bin/perl use warnings; use strict; use XML::Twig::XPath; # 无需单独加载XML::Twig,子类会自动继承父类 # 关键修改:用XML::Twig::XPath的构造函数创建对象 my $twig = XML::Twig::XPath->new(); $twig->parse('<MonitoringOutput id="test-id" version="0.1"> <description>This is a test output</description> <exit_code>0</exit_code> <status_string>OK</status_string> <info_string>(demo): Some interesting story</info_string> <perf_string>L1=0.49 L2=4.7s;;;0;7 L3=0.6;@0.2:0.3</perf_string> <perf_data count="3"> <sample label="L3"> <label>L3</label> <value>0.6</value> <thresholds> <warn end="0.3" inverted="1" start="0.2"/> </thresholds> </sample> <sample label="L1"> <label>L1</label> <value>0.49</value> </sample> <sample label="L2"> <label>L2</label> <value unit="s">4.7</value> <unit>s</unit> <range max="7" min="0"/> </sample> <warn_labels count="0"/> <crit_labels count="0"/> </perf_data> </MonitoringOutput>'); # 现在findnodes可以正常执行复杂XPath查询了 my @nodes = $twig->findnodes('//info_string[text()]'); foreach my $node (@nodes) { print "匹配到的节点内容: ", $node->text(), "\n"; }
额外说明
XML::Twig::XPath是XML::Twig的子类,会自动加载父类功能,无需重复写use XML::Twig- 只有
XML::Twig::XPath实例的findnodes方法才会调用完整的XPath引擎,普通XML::Twig实例的findnodes只是原生get_xpath的别名,仅支持有限的XPath语法
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

