http://qs1969.pair.com?node_id=430424


in reply to Formatting in XML::Twig->print()

Mirod, I'm testing with XML::Twig v3.15 on WinXP and v3.16 on Linux, both produce the same behavior.

Here is a minimal test stub that re-creates the formatting issue on my test machines.

#!/bin/perl -w use strict; use XML::Twig; my $file = 'input.xml'; my $parser = new XML::Twig(KeepSpaces => 'true', ErrorContext => 2); $parser->parsefile($file); my $sc = $parser->root->first_child( q{ServerCluster[@Name="cl_app302_ +prod"]} ); my $ps = $sc->first_child('PrimaryServers'); $ps->cut_children; $ps->insert_new_elt( Server => { Name => "New_1"}); $ps->insert_new_elt( Server => { Name => "New_2"}); open(PF, "> out.xml") or die "can't open file $!\n"; $parser->root->print(\*PF);
The input.xml file contains:
<?xml version="1.0" encoding="ISO-8859-1"?> <Config ASDisableNagle="false" AcceptAllContent="false" IISDisableNagl +e="false" IgnoreDNSFailures="false" RefreshInterval="60" ResponseChun +kSize="64"> <Log LogLevel="Error" Name="/opt/IBMWebAS/logs/native.log"/> <VirtualHostGroup Name="foobarcom"> <VirtualHost Name="foo.bar.com"/> </VirtualHostGroup> <ServerCluster CloneSeparatorChange="false" LoadBalance="Round Robi +n" Name="cl_app302_prod" PostSizeLimit="-1" RemoveSpecialHeaders="tru +e" RetryInterval="60"> <Server CloneID="umjbf6mv" ConnectTimeout="0" ExtendedHandshake= +"false" LoadBalanceWeight="2" MaxConnections="-1" Name="swel3p_cl_app +302_prod" WaitForContinue="false"> <Transport Hostname="swel3p.bar.com" Port="8132" Protocol="ht +tp"/> </Server> <PrimaryServers> <Server Name="swel3p_sg_app302_prod"/> <Server Name="swel4p_sg_app302_prod"/> <Server Name="swel1r_sg_app302_prod"/> <Server Name="swel2r_sg_app302_prod"/> </PrimaryServers> </ServerCluster> <!-- APP URI groups point at urls --> <UriGroup Name="event/event.war_URIs"> <Uri AffinityCookie="JSESSIONID_302" Name="/event/*.jsp"/> <Uri AffinityCookie="JSESSIONID_302" Name="/event/ThreadedEven +tServlet"/> </UriGroup> <!-- Route statement bring it all together --> <Route ServerCluster="cl_app302_prod" UriGroup="event/event.war_URI +s" VirtualHostGroup="foobarcom"/> </Config>

Which on my systems produces:

<Config ASDisableNagle="false" AcceptAllContent="false" IISDisableNagl +e="false" IgnoreDNSFailures="false" RefreshInterval="60" ResponseChun +kSize="64"> <Log LogLevel="Error" Name="/opt/IBMWebAS/logs/native.log"/> <VirtualHostGroup Name="foobarcom"> <VirtualHost Name="foo.bar.com"/> </VirtualHostGroup> <ServerCluster CloneSeparatorChange="false" LoadBalance="Round Robi +n" Name="cl_app302_prod" PostSizeLimit="-1" RemoveSpecialHeaders="tru +e" RetryInterval="60"> <Server CloneID="umjbf6mv" ConnectTimeout="0" ExtendedHandshake= +"false" LoadBalanceWeight="2" MaxConnections="-1" Name="swel3p_cl_app +302_prod" WaitForContinue="false"> <Transport Hostname="swel3p.bar.com" Port="8132" Protocol="ht +tp"/> </Server> <PrimaryServers><Server Name="New_2"/><Server Name="New_1"/></Pr +imaryServers> </ServerCluster> <!-- APP URI groups point at urls --> <UriGroup Name="event/event.war_URIs"> <Uri AffinityCookie="JSESSIONID_302" Name="/event/*.jsp"/> <Uri AffinityCookie="JSESSIONID_302" Name="/event/ThreadedEven +tServlet"/> </UriGroup> <!-- Route statement bring it all together --> <Route ServerCluster="cl_app302_prod" UriGroup="event/event.war_URI +s" VirtualHostGroup="foobarcom"/> </Config>

-Nitrox

Replies are listed 'Best First'.
Re^2: Formatting in XML::Twig->print()
by mirod (Canon) on Feb 12, 2005 at 17:12 UTC
    my $parser = new XML::Twig(KeepSpaces => 'true', ErrorContext => 2);

    No more mystery: KeepSpaces essentially tells XML::Twig to keep its hands off of whitespace management. So if you want your elements to be indented, you will have to do it yourself, by inserting an element containing the appropriate whitespace between the 2 Server elements. Or you could probably remove the KeepSpaces option alltogether. Is there any reason why it's there?

      Without the KeepSpaces option, XML::Twig munges all the whitespace in the original XML so that the output looks like:
      <Config ASDisableNagle="false" AcceptAllContent="false" IISDisableNagl +e="false" IgnoreDNSFailures="false" RefreshInterval="60" ResponseChun +kSize="64"><Log LogLevel="Error" Name="/opt/IBMWebAS/logs/native.log" +/><VirtualHostGroup Name="foobarcom"><VirtualHost Name="foo.bar.com"/ +></VirtualHostGroup><ServerCluster CloneSeparatorChange="false" LoadB +alance="Round Robin" Name="cl_app302_prod" PostSizeLimit="-1" RemoveS +pecialHeaders="true" RetryInterval="60"><Server CloneID="umjbf6mv" Co +nnectTimeout="0" ExtendedHandshake="false" LoadBalanceWeight="2" MaxC +onnections="-1" Name="swel3p_cl_app302_prod" WaitForContinue="false"> +<Transport Hostname="swel3p.bar.com" Port="8132" Protocol="http"/></S +erver><PrimaryServers><Server Name="New_2"/><Server Name="New_1"/></P +rimaryServers></ServerCluster> <!-- APP URI groups point at urls --> <UriGroup Name="event/event.war_URIs"><Uri AffinityCookie="JSESSIO +NID_302" Name="/event/*.jsp"/><Uri AffinityCookie="JSESSIONID_302" Na +me="/event/ThreadedEventServlet"/></UriGroup> <!-- Route statement bring it all together --> <Route ServerCluster="cl_app302_prod" UriGroup="event/event.war_URI +s" VirtualHostGroup="foobarcom"/></Config>
      -Nitrox

        Indeed, but did you try using the pretty_print => 'indented' option too?