How to make XML::XPath ignore namespaces?

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

I'm trying to use XML::XPath to extract content from XML documents.  The
documents are specified with namespaces, but I want to use XPath expressions
without namespaces.  As far as I can tell, I had this working perfectly fine in
two different scripts.

It seems like sometime today, the behavior of XML::XPath has changed with
respect to this.  I don't see what I could have changed that has made this
behavior change.

I can get some manual tests to work, if I almost fully specify namespaces, using
a call to "set_namespace()" in the script (hardcoding the prefix I expect to
use) and specifying the prefix in the XPath expression.

Again, I'm pretty sure I had this working yesterday, without calling
"set_namespace()" in the script, or specifying prefixes in the XPath

If I don't add that "set_namespace()" call and specify prefixes in the
expression, I just get empty nodesets from my queries.

I tried setting "$XML::XPath::Namespaces" to zero before I create the first
XPath object, but that doesn't seem to make any difference.

The following is a simple script I pipe XML into:
#! /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";

Here's a sample command line:

% echo "<ns3:abc xmlns:ns3=\"xxx\"><ns3:def>ghi</ns3:def></ns3:abc>" | xpathtext

I would hope to get "ghi" from this, but I'm currently getting nothing.

Site Timeline