我正在尝试使用 XML::XPath 从 XML 文档中提取内容。文档是用命名空间指定的,但我想使用没有命名空间的 XPath 表达式。据我所知,我在两个不同的脚本中都能正常工作。
似乎今天的某个时候,XML::XPath 的行为在这方面发生了变化。我看不出我可以改变什么来改变这种行为。
如果我几乎完全指定命名空间,我可以让一些手动测试工作,在脚本中使用对“set_namespace()”的调用(硬编码我希望使用的前缀)并在 XPath 表达式中指定前缀。
同样,我很确定我昨天已经完成了这项工作,没有在脚本中调用“set_namespace()”,也没有在 XPath 表达式中指定前缀。
如果我不添加那个“set_namespace()”调用并在表达式中指定前缀,我只会从我的查询中得到空的节点集。
在创建第一个 XPath 对象之前,我尝试将“$XML::XPath::Namespaces”设置为零,但这似乎没有任何区别。
以下是我通过管道将 XML 导入的简单脚本:
#! /bin/perl
use XML::XPath;
use XML::XPath::XMLParser;
use Getopt::Long;
$| = 1;
my $opt_file;
GetOptions("f|file=s" => \$opt_file);
$XML::XPath::Namespaces = 0;
my $xpath;
if ($opt_file ne '') {
$xpath = XML::XPath->new(filename => $opt_file);
}
else {
$xpath = XML::XPath->new(ioref => \*STDIN);
}
while (my $expr = shift @ARGV) {
my $nodeset = $xpath->find($expr);
if ($nodeset) {
if ($opt_file ne '') {
print $opt_file . ":\n";
}
my $node;
for $node ($nodeset->get_nodelist) {
print $node->string_value() . "\n";
}
}
}
这是一个示例命令行:
% echo "<ns3:abc xmlns:ns3=\"xxx\"><ns3:def>ghi</ns3:def></ns3:abc>" | xpathtext "//def"
我希望从中得到“ghi”,但我目前一无所获。