The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright 2010 Kevin Ryde
#
# This file is part of RSS2Leafnode.
#
# RSS2Leafnode is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 3, or (at your option) any later
# version.
#
# RSS2Leafnode is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with RSS2Leafnode.  If not, see <http://www.gnu.org/licenses/>.

use 5.010;
use strict;
use warnings;
use FindBin;
use Data::Dumper;

my $rdf = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
my $atom = 'http://www.w3.org/2005/Atom';
my $w3 = 'http://www.w3.org/XML/1998/namespace';

sub xml_prefix {
  my ($elt) = @_;
  for (;;) {
    foreach my $attname ($elt->att_names) {
      if ($attname =~ /^xmlns:(.*)/) {
        my $prefix = $1;
        print "xml_prefix() consider $attname ",$elt->att($attname),"\n";
        if ($elt->att($attname) eq $w3) {
          return $prefix;
        }
      }
    }
    $elt = $elt->parent // last;
    print "xml_prefix() to parent\n";
  }
  print "xml_prefix() not found\n";
  return undef;
}

{
  my $xml = <<'HERE';
<x xmlns="http://www.w3.org/2005/Atom"
   xmlns:atom="http://www.w3.org/2005/Atom"
   xmlns:fff="http://foo.org">
  <fff:bar def="1" />
  <fff:quux xml:lang="en" xml:base="http://bas.com" atom:base="aaa" fff:base="2" />
</x>
HERE
  require XML::Twig;
  my $twig = XML::Twig->new
       (map_xmlns => {
                       'http://foo.org' => 'foo',
                       'http://def.org' => 'defa',
                       $w3 => 'xml',
                     })
    ;
  $twig->parse($xml);
  my $root = $twig->root;
  print $root->xml_string,"\n";

  my $elt = $root->first_descendant(qr/quux/);
  print $elt->tag,' ',join(' ',$elt->att_names),"\n";
  print "ns_prefix '", $elt->ns_prefix, "'\n";
  foreach my $prefix ($elt->current_ns_prefixes) {
    print "  '$prefix'  ",$elt->namespace($prefix),"\n";
  }
  print "namespace '", $elt->namespace, "'\n";
  print "namespace w3 '", $elt->namespace($w3), "'\n";
  print "namespace fff '", $elt->namespace('fff'), "'\n";

  my $prefix = xml_prefix($elt);
  print "pref ",$prefix//'undef',"\n";
  if (defined $prefix) {
    print "'${prefix}:base ",$elt->att("${prefix}:base"),"\n";
  } else {
    foreach my $attname ('xml:base', 'base') {
      print "'$attname' ",$elt->att($attname)//'undef',"\n";
    }
  }

  exit 0;
}