XML::Hash::LX(3pm)

πŸ“¦
version 0.0603 Β· 4 versions
, in debian bookworm, debian trixie, ubuntu jammy, ubuntu noble

πŸ’– XML::Hash::LX πŸ’–

okay bestie, so this is the manual page for XML::Hash::LX, and no cap, it's the User Contributed Perl Documentation version of it β€” a whole little module that flips hashes into xml and xml back into hashes using LibXML. it's giving ✨data transformation✨ and honestly? iconic.


🌸 NAME 🌸

XML::Hash::LX β€” Convert hash to xml and xml to hash using LibXML


πŸ¦‹ 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 ✨

so basically this module is a lil companion for XML::LibXML. it operates with LibXML objects, it can return or accept LibXML objects, and it's here 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 <http://search.cpan.org/uploads.rdf> πŸŽ€


πŸŽ€ EXPORT πŸŽ€

xml2hash and hash2xml are exported by default. periodt. πŸ’…

:inject

Inject toHash method in the namespace of XML::LibXML::Node and allow one 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 ]

If the doc option is true, then the returned value is XML::LibXML::Document, not a string.


πŸ’… OPTIONS πŸ’…

Every option could be passed as arguments to function or set as global variable in the 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" />  =>  { node => { -attr => "test" } }
  • text [ = '#text' ] β€” Key name for storing text.
        <node>text<sub /></node>  =>  { node => { sub => '', '#text' => "test" } }
  • join [ = '' ] β€” Join separator for text nodes, split by subnodes.

Ignored when order in effect.

        # default:
        xml2hash( '<item>Test1<sub />Test2</item>' )
        : { item => { sub => '', '~' => 'Test1Test2' } };

        # global
        $XML::Hash::LX::X2H{join} = '+';
        xml2hash( '<item>Test1<sub />Test2</item>' )
        : { item => { sub => '', '~' => 'Test1+Test2' } };

        # argument
        xml2hash( '<item>Test1<sub />Test2</item>', 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><![CDATA[ test ]]></node>  =>  { node => 'test' }

        # cdata = '#'
        <node><![CDATA[ test ]]></node>  =>  { node => { '#' => 'test' } }
  • comm [ = undef ] β€” When defined, comments sections will be stored under this key.

When undef, comments will be ignored.

        # comm = undef
        <node><!-- comm --><sub/></node>  =>  { node => { sub => '' } }

        # comm = '/'
        <node><!-- comm --><sub/></node>  =>  { 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/></node>  =>  { node => { sub => '' } }

        # $X2A = 1
        <node><sub/></node>  =>  { 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/></node>  =>  { node => { sub => '' } }

        # %X2A = ( sub => 1 )
        <node><sub/></node>  =>  { node => { sub => [ '' ] } }

%XML::Hash::LX::H2X

Options respecting convertations from hash to xml 🌈

  • encoding [ = 'utf-8' ] β€” XML output encoding.
  • attr [ = '-' ] β€” Attribute prefix.
        { node => { -attr => "test", sub => 'test' } }
        <node attr="test"><sub>test</sub></node>
  • text [ = '#text' ] β€” Key name for storing text.
        { node => { sub => '', '#text' => "test" } }
        <node>text<sub /></node>
        # or
        <node><sub />text</node>
        # order of keys is not predictable
  • trim [ = 1 ] β€” Trim leading and trailing whitespace from text nodes.
        # trim = 1
        { node => { sub => [ '    ', 'test' ], '#text' => "test" } }
        <node>test<sub>test</sub></node>

        # trim = 0
        { node => { sub => [ '    ', 'test' ], '#text' => "test" } }
        <node>test<sub>    test</sub></node>
  • cdata [ = undef ] β€” When defined, such key elements will be saved as CDATA sections.
        # cdata = undef
        { node => { '#' => 'test' } } => <node><#>test</#></node> # it's bad ;)

        # cdata = '#'
        { node => { '#' => 'test' } } => <node><![CDATA[test]]></node>
  • comm [ = undef ] β€” When defined, such key elements will be saved as comment sections.
        # comm = undef
        { node => { '/' => 'test' } } => <node></>test<//></node> # it's very bad! ;)

        # comm = '/'
        { node => { '/' => 'test' } } => <node><!-- test --></node>

πŸ’€ 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, "<mons at cpan.org>"


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.


okay that's the whole thing bestie, you ate πŸ’– this was perl v5.32.0 flavoured, dated 2021-01-05, straight from the XML::Hash::LX(3pm) page itself β€” go forth and transform some hashes, no cap πŸŽ€βœ¨

πŸ“¦ where this page comes from