NAME XML::Hash::LX - Convert hash to xml and xml to hash using LibXML VERSION Version 0.06 SYNOPSIS use XML::Hash::LX; my $hash = xml2hash $xmlstring, attr => '.', text => '~'; my $hash = xml2hash $xmldoc; my $xmlstr = hash2html $hash, attr => '+', text => '#text'; my $xmldoc = hash2html $hash, doc => 1, attr => '+'; # Usage with XML::LibXML my $doc = XML::LibXML->new->parse_string($xml); my $xp = XML::LibXML::XPathContext->new($doc); $xp->registerNs('rss', 'http://purl.org/rss/1.0/'); # then process xpath for ($xp->findnodes('//rss:item')) { # and convert to hash concrete nodes my $item = xml2hash($_); print Dumper+$item } DESCRIPTION This module is a companion for "XML::LibXML". It operates with LibXML objects, could return or accept LibXML objects, and may be used for easy data transformations It is faster in parsing then XML::Simple, XML::Hash, XML::Twig and of course much slower than XML::Bare ;) It is faster in composing than XML::Hash, but slower than XML::Simple Parse benchmark: Rate Simple Hash Twig Hash::LX Bare Simple 11.3/s -- -2% -16% -44% -97% Hash 11.6/s 2% -- -14% -43% -97% Twig 13.5/s 19% 16% -- -34% -96% Hash::LX 20.3/s 79% 75% 51% -- -95% Bare 370/s 3162% 3088% 2650% 1721% -- Compose benchmark: Rate Hash Hash::LX Simple Hash 49.2/s -- -18% -40% Hash::LX 60.1/s 22% -- -26% Simple 81.5/s 66% 36% -- Benchmark was done on EXPORT "xml2hash" and "hash2xml" are exported by default :inject Inject toHash method in the namespace of XML::LibXML::Node and allow to call it on any subclass of XML::LibXML::Node directly By default is disabled use XML::Hash::LX ':inject'; my $doc = XML::LibXML->new->parse_string($xml); my $hash = $doc->toHash(%opts); FUNCTIONS xml2hash $xml, [ OPTIONS ] XML could be XML::LibXML::Document, XML::LibXML::DocumentPart or string hash2xml $hash, [ doc => 1, ] [ OPTIONS ] Id "doc" option is true, then returned value is XML::LibXML::Document, not string OPTIONS Every option could be passed as arguments to function or set as global variable in "XML::Hash::LX" namespace %XML::Hash::LX::X2H Options respecting convertations from xml to hash order [ = 0 ] Strictly keep the output order. When enabled, structures become more complex, but xml could be completely reverted attr [ = '-' ] Attribute prefix => { node => { -attr => "test" } } text [ = '#text' ] Key name for storing text text => { node => { sub => '', '#text' => "test" } } join [ = '' ] Join separator for text nodes, splitted by subnodes Ignored when "order" in effect # default: xml2hash( 'Test1Test2' ) : { item => { sub => '', '~' => 'Test1Test2' } }; # global $XML::Hash::LX::X2H{join} = '+'; xml2hash( 'Test1Test2' ) : { item => { sub => '', '~' => 'Test1+Test2' } }; # argument xml2hash( 'Test1Test2', join => '+' ) : { item => { sub => '', '~' => 'Test1+Test2' } }; trim [ = 1 ] Trim leading and trailing whitespace from text nodes cdata [ = undef ] When defined, CDATA sections will be stored under this key # cdata = undef => { node => 'test' } # cdata = '#' => { node => { '#' => 'test' } } comm [ = undef ] When defined, comments sections will be stored under this key When undef, comments will be ignored # comm = undef => { node => { sub => '' } } # comm = '/' => { node => { sub => '', '/' => 'comm' } } $XML::Hash::LX::X2A [ = 0 ] Global array casing Ignored when "X2H{order}" in effect As option should be passed as xml2hash $xml, array => 1; Effect: # $X2A = 0 => { node => { sub => '' } } # $X2A = 1 => { node => [ { sub => [ '' ] } ] } %XML::Hash::LX::X2A By element array casing Ignored when "X2H{order}" in effect As option should be passed as xml2hash $xml, array => [ nodes list ]; Effect: # %X2A = () => { node => { sub => '' } } # %X2A = ( sub => 1 ) => { node => { sub => [ '' ] } } %XML::Hash::LX::H2X Options respecting convertations from hash to xml attr [ = '-' ] Attribute prefix { node => { -attr => "test", sub => 'test' } } test text [ = '#text' ] Key name for storing text { node => { sub => '', '#text' => "test" } } text # or text # order of keys is not predictable trim [ = 1 ] Trim leading and trailing whitespace from text nodes # trim = 1 { node => { sub => [ ' ', 'test' ], '#text' => "test" } } testtest # trim = 0 { node => { sub => [ ' ', 'test' ], '#text' => "test" } } test test cdata [ = undef ] When defined, such key elements will be saved as CDATA sections # cdata = undef { node => { '#' => 'test' } } => <#>test # it's bad ;) # cdata = '#' { node => { '#' => 'test' } } => comm [ = undef ] When defined, such key elements will be saved as comment sections # comm = undef { node => { '/' => 'test' } } => test # it's very bad! ;) # comm = '/' { node => { '/' => 'test' } } => BUGS None known SEE ALSO * XML::Parser::Style::EasyTree With default settings should produce the same output as this module. Settings are similar by effect AUTHOR Mons Anderson, "" COPYRIGHT & LICENSE Copyright 2009 Mons Anderson, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.