Hi, I need to dynamically generate an XML structure. With this code..
use strict; use warnings; use XML::Simple; BEGIN { @__PACKAGE__::XML::ISA = qw/ XML::Simple /; my %order = ( TestResult => [ qw/xmlns xmlns:xsi xsi:schemaLocation Result Comments Para +meters Files Images /], ); *__PACKAGE__::XML::sorted_keys = sub { my ( $self, $name, $h ) = @_; return @{ $order{$name} } if $order{$name}; sort keys %$h; }; } sub new { my ($class) = @_; my $self = { _xml => { "xmlns" => "Someinfo", "xmlns:xsi" => "Someinfo", "xsi:schemaLocation" => "Someinfo", }, }; bless $self => $class; } sub comments { my ( $self, $comments ) = @_; $self->{_xml}{Comments} = { content => $comments }; } sub result { my ( $self, $result ) = @_; $self->{_xml}{Result} = { content => $result }; } sub image { my ( $self, $image, $desc ) = @_; my $imageid = "Image" . $image; $self->{_xml}{Images}{$imageid} = { content => $desc }; } sub file { my ( $self, $file, $desc ) = @_; my $fileid = "File" . $file; $self->{_xml}{Files}{$fileid} = { content => $desc }; } sub parameter { my ( $self, $group, $key, $value ) = @_; my $groupid = "Group".$group; my $keyid = "Key".$key; $self->{_xml}{Parameters}{Parameter}{$groupid}{Parameter}{$keyid} += { content => $value }; } sub as_xml { my ($self) = @_; my $file_name = "output.xml"; my $serialize = __PACKAGE__::XML->new; my @arrayout= $serialize->XMLout( $self->{_xml}, GroupTags => { Files => "File", Images => "Image", Parameters => "ParameterGroup", ParameterGroup => "Parameter" }, KeyAttr => { ParameterGroup => "+ID", Parameter => "+key", File => "+key", Image => "+key", }, RootName => "TestResult", XMLDecl => 1, ); foreach ( @arrayout ) { open FH, ">>$file_name" or die "can't open '$file_name': $!"; print FH $_; close FH; }
Using this below script,
my $tr = Reporting->new; $tr->parameter(1, 1, "Some Process A Happened"); $tr->parameter(1, 2, "Some Process B Happened"); $tr->parameter(2, 1, "Some Process A Happened"); $tr->parameter(3, 1, "Some Process Happened"); $tr->image(1, "Some info"); $tr->parameter(6, 1, "Some Process Z Happened"); $tr->file(10, "Some File"); $tr->result("Pass"); $tr->comments("Executed Successfully"); print $tr->as_xml;
I was able to get this something like
<?xml version='1.0' standalone='yes'?> <TestResult xmlns="some info" xmlns:xsi="some info" xsi:schemaLocation +="some info"> <Result>Pass</Result> <Comments>Executed Successfully</Comments> <Parameters> <ParameterGroup ID="Parameter"> <Parameter key="Group1"> <Parameter key="1">Some Process A Happened</Parameter> <Parameter key="2">Some Process B Happened</Parameter> </Parameter> <Parameter key="Group2"> <Parameter key="1">Some Process A Happened</Parameter> </Parameter> <Parameter key="Group3"> <Parameter key="1">Some Process Happened</Parameter> </Parameter> <Parameter key="Group6"> <Parameter key="1">Some Process Z Happened</Parameter> </Parameter> </ParameterGroup> </Parameters> <Files> <File key="File10">Some File</File> </Files> <Images> <Image key="Image1">Some info</Image> </Images> </TestResult>
But I need the parameters part of the XML to look like this,
<Parameters> <ParameterGroup ID="Group1"> <Parameter key="Key1">Some Value</Parameter> <Parameter key="Key2">Some Value</Parameter> <Parameter key="Key3">Some Value</Parameter> </ParameterGroup> <ParameterGroup ID="Group2"> <Parameter key="Key1">Some Value</Parameter> <Parameter key="Key2">Some Value</Parameter> <Parameter key="Key3">Some Value</Parameter> </ParameterGroup> </Parameters>
Where is it going wrong? Thanks..

In reply to Need change in dynamic XML Structure using XML::Simple by Perllace

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.