The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Simple::SAX::Serializer::Handler - Collections of the mapping handlers for Simple::SAX::Serializer.

SYNOPSIS

    use Simple::SAX::Serializer::Handler ':all';
    use Simple::SAX::Serializer;

    my $xml = Simple::SAX::Serializer->new;
    $xml->handler('node', array_handler());
    ...
    my $result = $xml->parse_string($xml_content);

DESCRIPTION

Collections of the mapping handlers for Simple::SAX::Serializer.

EXPORT

array_handler array_of_objects_handler hash_handler hash_item_of_child_value_handler hash_of_object_array_handler hash_of_array_handler ignore_node_handler custom_array_handler object_handler root_object_handler by ':all' tag

METHODS

array_handler

Takes optionally storage key to the array(by default the element name). Returns handler for transforming nodes value into array

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root >
        <node>value1</node>
        <node>value2</node>
        <nodeA>value1</nodeA>
        <nodeA>value2</nodeA>
    </root>
    XML


    my $xml = Simple::SAX::Serializer->new;

    $xml->handler('node', array_handler());
    $xml->handler('nodeA', array_handler());
    $xml->handler('root', sub {
        my ($self, $element, $parent) = @_;
        my $attributes = $element->attributes;
        my $result = $element->children_result;
    });
    my $result = $xml->parse_string($xml_content);
    #transforms $result to {{node => ['value1' ,'value2'], nodeA => ['value1', 'value2']}
array_of_objects_handler

Returns handler for transforming nodes attribute into array of the objects. Takes class name or constructor code reference as parameter, array ref of the required attributes, hash_ref of the optional attributes,

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <object1 attr1="1" />
        <object1 attr1="2" />
        <object2 attr1="3" />
        <object2 attr1="4" />
    </root>
    XML

    package Object1;
    sub new {
        my $class = shift;
        bless {@_}, $class
    };

    package Object2;
    sub new {
        my $class = shift;
        bless {@_}, $class
    };

    sub object2{
        Object2->new(@_);
    }

    my $xml = Simple::SAX::Serializer->new;

    $xml->handler('object1', ::array_of_objects_handler('Object1', ['attr1']));
    $xml->handler('object2', ::array_of_objects_handler(\&object2, ['attr1']));
    $xml->handler('root', sub {
        my ($self, $element, $parent) = @_;
        my $attributes = $element->attributes;
        $element->children_result;
    });
    my $result = $xml->parse_string($xml_content);

    #transforms $result to [
        Object1->new(attr1 => 1),
        Object1->new(attr1 => 2),
        Object2->new(attr1 => 3),
        Object2->new(attr1 => 4),
    ];
hash_of_object_array_handler

Returns handler for transforming nodes attribute into array of the objects, that is stored as hash item of the parent node. Takes class name or constructor code reference as parameter, array ref of the required attributes, hash_ref of the optional attributes, storage key to the array(by default the element name).

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <object1 attr1="1" />
        <object1 attr1="2" />
    </root>
    XML

    my $xml = Simple::SAX::Serializer->new;

    $xml->handler('object1', hash_of_object_array_handler('Object1', ['attr1']));
    $xml->handler('root', sub {
        my ($self, $element, $parent) = @_;
        my $attributes = $element->attributes;
        $element->children_result;
    });
    my $result = $xml->parse_string($xml_content);

    #transforms $result to [
        Object1->new(attr1 => 1),
        Object1->new(attr1 => 2),
        Object2->new(attr1 => 3),
        Object2->new(attr1 => 4),
    ];
hash_of_array_handler

Returns handler for transforming nodes attribute into array of the hash items, that is stored as hash item of the parent node. Takes array ref of the required attributes, hash_ref of the optional attributes, storage key to the array(by default the element name).

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <object1 attr1="1" />
        <object1 attr1="2" />
    </root>
    XML

    my $xml = Simple::SAX::Serializer->new;

    $xml->handler('object1', hash_of_array_handler(['attr1']));
    $xml->handler('root', root_object_handler('Root'));

    my $result = $xml->parse_string($xml_content);
    #converts result to 
    Root->new(object1 => [{attr1 => 1}, {attr1 => 2}]);
hash_handler

Takes optionally parent storage key to the hash item (by default the element name). optionally attribute name for the hash key (by default name). Returns handler for transforming node into hash item. Key of the hash is evaluated from the name node's attribute. Value of the hash is evaluated from the node's value.

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <node name="key1">value1</node>
        <node name="key2">value2</node>
        <node name="key3">value3</node>
    </root>
    XML

    my $xml = Simple::SAX::Serializer->new;
    $xml->handler('node', hash_handler());
    $xml->handler('root', root_object_handler('Root'));
    my $result = $xml->parse_string($xml_content);

    #transforms $result to Root->new(node => {key1 => 'value1', key2 => 'value2', key3 => 'value3'})
hash_item_of_child_value_handler

Takes optionally parent storage key to the hash item (by default the element name). Returns handler for transforming child node value into hash value Key of the hash is evaluated from current element name.

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <objects>
            <object1 attr1="1" />
            <object1 attr1="2" />
        </objects>
        <objects2>
            <object2 attr1="3" />
            <object2 attr1="4" />
        </objects2>
    </root>
    XML

    my $xml = Simple::SAX::Serializer->new;
    $xml->handler('objects', hash_item_of_child_value_handler());
    $xml->handler('object1', array_of_objects_handler('Object1'));

    $xml->handler('objects2', hash_item_of_child_value_handler());
    $xml->handler('object2', array_of_objects_handler('Object2'));
    $xml->handler('root', sub {
        my ($self, $element, $parent) = @_;
        my $attributes = $element->attributes;
        $element->children_result;
    });
    my $result = $xml->parse_string($xml_content);
    #transforms $result to {
        objects => [Object1->new(attr1 => 1), Object1->new(attr1 => 2),],
        objects2 => [Object2->new(attr1 => 3), Object2->new(attr1 => 4),]
    };
root_object_handler

Returns handler for transforming root node into an object,

Takes class name or constructor code reference, optionally code reference to customize return values, array ref of the required attributes, hash_ref of the optional attributes,

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root attr1="1" attr2="2">
        <objects>
            <object1 attr1="1" />
            <object1 attr1="2" />
        </objects>
        <object2>3</object2>
        <object2>4</object2>

    </root>
    XML

    {
        package Root;
        sub new {
            my $class = shift;
            bless {@_}, $class
        };
    }

    my $xml = Simple::SAX::Serializer->new;
    $xml->handler('objects', hash_item_of_child_value_handler());
    $xml->handler('object1', array_of_objects_handler('Object1'));
    $xml->handler('object2', array_handler());
    $xml->handler('root', root_object_handler('Root'));

    #transforms $result to 
    Root->new(
        attr1 => 1, attr2 => 2,
        objects => [Object1->new(attr1 => 1), Object1->new(attr1 => 2),],
        object2 => [3, 4]
    );
ignore_node_handler
custom_array_handler

Returns handler for transforming roo node to object, Takes hash ref as custom result storage, optionally array ref of the required attributes, hash_ref of the optional attributes, custom storage key to the hash item (by default the element name). This options allows parsing only part of the xml document.

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <node name="key1" attr1="1" />
        <node name="key2" attr1="2" />
    </root>
    XML


    my $result = {};
    my $xml = Simple::SAX::Serializer->new;
    $xml->handler('root', ignore_node_handler());
    $xml->handler('node', custom_array_handler($result, ['name', 'attr1'], {optional_attr1 => undef, attr2 => '2'}, 'my_key'));

    #or without attributes validation
    $xml->handler('node', custom_array_handler($result, undef, undef, 'my_key'));

    $xml->parse_string($xml_content);

    #transforms $result to ,{ my_key => [
        {name => 'key1', attr1 => '1', optional_attr1 => undef, attr2 => 2},
        {name => 'key2', attr1 => '2', optional_attr1 => undef, attr2 => 2}
        ]
    };
object_handler

Returns handler for transforming node into an object, Takes class name or constructor code reference, optionally array ref of the required attributes, hash_ref of the optional attributes, parent storage key to the hash item (by default the element name).

    my $xml_content = <<XML;
    <?xml version="1.0"?>
    <root>
        <object1 attr1="1" />
        <object1 attr1="2" />
    </root>
    XML

    my $xml = Simple::SAX::Serializer->new;

    $xml->handler('object1', hash_of_object_array_handler('Object1', ['attr1']));
    $xml->handler('root', root_object_handler('Root'));

    my $result = $xml->parse_string($xml_content);
    #transforms result to 
    Root->new(object1 => [Object1->new(attr1 => 1),Object1->new(attr1 => 2)]);

SEE ALSO

Simple::SAX::Serializer::Element

COPYRIGHT AND LICENSE

The Simple::SAX::Serializer::Handler module is free software. You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.

AUTHOR

Adrian Witas, adrian@webapp.strefa.pl