Any::Renderer::XML - render a data structure as element-only XML


Any-Renderer documentation Contained in the Any-Renderer distribution.

Index


Code Index:

NAME

Top

Any::Renderer::XML - render a data structure as element-only XML

SYNOPSIS

Top

  use Any::Renderer;

  my %xml_options = ();
  my %options = ( 'XmlOptions' => \%xml_options );
  my $format = "XML";
  my $r = new Any::Renderer ( $format, \%options );

  my $data_structure = [...]; # arbitrary structure code
  my $string = $r->render ( $data_structure );

You can get a list of all formats that this module handles using the following syntax:

  my $list_ref = Any::Renderer::XML::available_formats ();

Also, determine whether or not a format requires a template with requires_template:

  my $bool = Any::Renderer::XML::requires_template ( $format );

DESCRIPTION

Top

Any::Renderer::XML renders any Perl data structure passed to it as element-only XML. For example:

  perl -MAny::Renderer -e "print Any::Renderer->new('XML')->render({a => 1, b => [2,3]})"

results in:

  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
  <output>
    <a>1</a>
    <b>2</b>
    <b>3</b>
  </output>

The rendering process comes with all the caveats cited in the XML::Simple documentation. For example if your data structure contains binary data or ASCII control characters, then the XML document that is generated may not be well-formed.

FORMATS

Top

XML

METHODS

Top

$r = new Any::Renderer::XML($format,\%options)

$format must be XML. See OPTIONS for a description of available options.

$scalar = $r->render($data_structure)

The main method.

$bool = Any::Renderer::XML::requires_template($format)

False in this case.

$list_ref = Any::Renderer::XML::available_formats()

Just the one - XML.

OPTIONS

Top

XmlOptions

A hash reference of options that can be passed to XML::Simple::XMLout, see XML::Simple for a detailed description of all of the available options.

VariableName

Set the XML root element name. You can also achieve this by setting the RootName or rootname options passed to XML::Simple in the XML options hash. This is a shortcut to make this renderer behave like some of the other renderer backends.

Encoding

Character set of the generated XML document. Defaults to ISO-8859-1.

SEE ALSO

Top

XML::Simple, Any::Renderer

VERSION

Top

$Revision: 1.8 $ on $Date: 2006/08/22 20:14:09 $ by $Author: johna $

AUTHOR

Top

Matt Wilson <cpan _at_ bbc _dot_ co _dot_ uk>

COPYRIGHT

Top


Any-Renderer documentation Contained in the Any-Renderer distribution.

package Any::Renderer::XML;

# $Id: XML.pm,v 1.8 2006/08/22 20:14:09 johna Exp $

use strict;
use vars qw($VERSION);
use XML::Simple;

$VERSION = sprintf"%d.%03d", q$Revision: 1.8 $ =~ /: (\d+)\.(\d+)/;

use constant FORMAT_NAME => "XML";

sub new
{
  my ( $class, $format, $options ) = @_;
  die("Invalid format $format") unless($format eq FORMAT_NAME);

  my $self = {
    'options' => $options,
  };

  bless $self, $class;
  return $self;
}

sub render
{
  my ( $self, $data ) = @_;

  TRACE ( "Rendering XML data" );
  DUMP ( $data );

  my $charset = $self->{options}{Encoding} || 'ISO-8859-1';
  my %xmlopts = (
    'noattr'      => 1,
    'keyattr'     => undef,
    'keeproot'    => 1,
    'rootname'    => 'output',
    'xmldecl'     => qq{<?xml version="1.0" encoding="$charset" standalone="yes"?>},
    'contentkey'  => undef,
    'noescape'    => 0,
  );

  while ( my ( $k, $v ) = each %{ $self->{ 'options' }->{ 'XmlOptions' } } )
  {
    # smash case to ensure the options override defaults
    $xmlopts { lc $k } = $v;
  }

  if (my $varname = $self->{ 'options' }{ 'VariableName' }) {
    # VariableName overrides the 'options' hash
    $xmlopts { 'rootname' } =  $varname;
  }

  my $out = '';

  {
    # XML::Simple 1.23 produces use-of-uninitialized... warnings
    local $^W = 0;
    $out = XML::Simple::XMLout ( $data, %xmlopts );
  }

  return $out;
}

sub requires_template
{
  my ( $format ) = @_;

  return 0;
}

sub available_formats
{
  return [ FORMAT_NAME ];
}

sub TRACE {}
sub DUMP {}

1;