XML::XPath を使用して XML ドキュメントからコンテンツを抽出しようとしています。ドキュメントは名前空間で指定されていますが、名前空間なしで XPath 式を使用したいと考えています。私が知る限り、これは 2 つの異なるスクリプトで完全に正常に機能していました。
今日、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」を得たいと思っていますが、現在何も得られていません。