http://www.perlmonks.org?node_id=640567

Popcorn Dave has asked for the wisdom of the Perl Monks concerning the following question:

Fellow monks,

I'm finally getting my feet wet with XML by trying to combine two XML files in to one. So far so good, but when I write the XML file back, attribute indentation in XML::Simple is being ignored.

open FH, ">", "webcams.xml"; print FH XMLout($combined, KeyAttr => {AttrIndent => 1, xmldecl => '<?xml version="1.0" encoding=" +UTF-8"?>',}); close FH;

As it stands, the code is printing the XML as this:

<opt class="java.beans.XMLDecoder" version="1.6.0-oem"> <object class="java.util.HashSet"> <void method="add" string="baseball" /> <void method="add" string="football" /> </object> </opt>
According to the docs, unless I misread them, the AttrIndent => 1 should indent the tags so it looks like this:

<java version="1.6.0_02" class="java.beans.XMLDecoder"> <object class="java.util.HashSet"> <void method="add"> <string>baseball</string> </void> <void method="add"> <string>football</string> </void> </object> </java>

What have I overlooked to get the indentation to work as in the second XML example?

Thanks in advance!


Revolution. Today, 3 O'Clock. Meet behind the monkey bars.

I would love to change the world, but they won't give me the source code

Replies are listed 'Best First'.
Re: XML::Simple attribute indentation not working
by andreas1234567 (Vicar) on Sep 23, 2007 at 07:35 UTC
    I don't think AttrIndent does what you expect.

    XML::Simple:

    AttrIndent => 1 # out - handy

    When you are using XMLout(), enable this option to have attributes printed one-per-line with sensible indentation rather than all on one line.

    Update 1: Args to XMLout is a list, not a hash, as pointed out by Anonymous Monk.

    Update 2: Using use XML::Simple qw(:strict); would have given a warning:

    No value specified for 'ForceArray' option in call to XMLin()
    use strict; use warnings; use XML::Simple; my $str = <<EOL; <opt class="java.beans.XMLDecoder" version="1.6.0-oem"> <object class="java.util.HashSet"> <void method="add" string="baseball" /> <void method="add" string="football" /> </object> </opt> EOL my $ref = XMLin($str); open FH, ">", "webcams.xml" or die ("open failed"); print FH XMLout($ref, AttrIndent => 1, xmldecl => '<?xml version="1.0" encoding="UTF-8"?>'); close FH or die ("close failed"); __END__ <?xml version="1.0" encoding="UTF-8"?> <opt class="java.beans.XMLDecoder" version="1.6.0-oem"> <object class="java.util.HashSet"> <void method="add" string="baseball" /> <void method="add" string="football" /> </object> </opt>
    --
    Andreas
Re: XML::Simple attribute indentation not working
by Anonymous Monk on Sep 23, 2007 at 07:27 UTC
Re: XML::Simple attribute indentation not working
by Popcorn Dave (Abbot) on Sep 24, 2007 at 16:29 UTC
    Thank you both for the replies! I see where I went wrong now.

    That said, is there something that I've overlooked in XML::Simple that will actually break out the tags rather than what I would call the shorthand verstion( for lack of a better term )?

    For example:

    <void method="add"> <string>baseball</string> </void>
    instead of
    <void method="add" string="baseball" />
    or is this something that I'm going to have to re-parse and rewrite myself?


    Revolution. Today, 3 O'Clock. Meet behind the monkey bars.

    I would love to change the world, but they won't give me the source code