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

# A skeleton Atom document with extensions, to show different
#  behaviour of namespaces and prefixes

use strict;

use XML::Writer;

my $ATOM = 'http://www.w3.org/2005/Atom';
my $EXT = 'http://www.example.com/feed-extension';
my $EXT2 = 'http://www.example.com/feed-extension-2';
my $EXT3 = 'http://www.example.com/feed-extension-3';

my $w = XML::Writer->new(
	NAMESPACES => 1,
	DATA_MODE => 1,

	# Define prefixes for most of the namespaces
	PREFIX_MAP => {
		$ATOM => '',
		$EXT => 'ext',
		$EXT2 => 'ext2'
	},

	# Force a declaration for the first extension on the root element
	FORCED_NS_DECLS => [$EXT]
);


$w->comment(' An Atom feed with namespace declarations ');

$w->startTag([$ATOM, 'feed']);

# The root element will include a declaration for its own namespace
#  and the contents of FORCED_NS_DECLS
$w->dataElement([$ATOM, 'title'], "Feed Title");

# This namespace has already been declared on the root as the default
$w->dataElement([$EXT, 'example'], "true");

# This namespace had its name defined but the declaration hasn't appeared yet.
#  It will be included on demand, on this element.
$w->dataElement([$EXT2, 'definitely-an-example'], "true");

# This namespace has no prefix defined - an artificial prefix will be
#  used (something like __NS1)
$w->dataElement([$EXT3, 'most-definitely-an-example'], "true");

$w->endTag([$ATOM, 'feed']);

$w->end();