# XML::Toolkit #
XML::Toolkit is a suite of tools that work to make handling XML easier. It is designed to marshall XML documents into Moose classes and back again with minimal changes.
For example given a xml document like the following
Tove
Jani
Reminder
Don't forget me this weekend!
XML::Toolkit will generate classes for each of the elements. The element's class would be something like
package MyApp::Note;
use Moose;
use namespace::autoclean;
use XML::Toolkit;
has 'to_collection' => (
isa => 'ArrayRef[MyApp::To]',
is => 'ro',
init_arg => 'tos',
traits => [qw(XML Array)],
lazy => 1,
auto_deref => 1,
default => sub { [] },
handles => { add_to => ['push'] },
description => {
Prefix => "",
LocalName => "to",
node_type => "child",
Name => "to",
NamespaceURI => "",
sort_order => 0,
},
);
has 'from_collection' => (
isa => 'ArrayRef[MyApp::From]',
is => 'ro',
init_arg => 'froms',
traits => [qw(XML Array)],
lazy => 1,
auto_deref => 1,
default => sub { [] },
handles => { add_from => ['push'] },
description => {
Prefix => "",
LocalName => "from",
node_type => "child",
Name => "from",
NamespaceURI => "",
sort_order => 1,
},
);
has 'body_collection' => (
isa => 'ArrayRef[MyApp::Body]',
is => 'ro',
init_arg => 'bodys',
traits => [qw(XML Array)],
lazy => 1,
auto_deref => 1,
default => sub { [] },
handles => { add_body => ['push'] },
description => {
Prefix => "",
LocalName => "body",
node_type => "child",
Name => "body",
NamespaceURI => "",
sort_order => 2,
},
);
has 'heading_collection' => (
isa => 'ArrayRef[MyApp::Heading]',
is => 'ro',
init_arg => 'headings',
traits => [qw(XML Array)],
lazy => 1,
auto_deref => 1,
default => sub { [] },
handles => { add_heading => ['push'] },
description => {
Prefix => "",
LocalName => "heading",
node_type => "child",
Name => "heading",
NamespaceURI => "",
sort_order => 3,
},
);
1;
__END__
You can then use the set of classes to load the original document, or create new documents that match this structure.
my $document = MyApp::Note->new(
to_collection => [MyApp::To->new(text => 'Bob')],
from_collection => [MyApp::From->new(text => 'Alice')],
headings => [MyApp::Heading->new(text => 'Secret' )],
body_collection => [MyApp::Body->new(text=>'Shh!')],
)
my $generator = Generator->new( );
$generator->render_object($document);
print $document->output;
# output
#
#
# Bob
# Alice
# Secret
# Shhh!
#
The original intention of XML::Toolkit was to round-trip XML documents with an unkonwn schema through an editor and back out to disk with very few semantic or structural changes.