in reply to XML::Write challenges

You need to post a complete SSCCE because this works for me.

#!/usr/bin/perl use strict; use XML::Writer; printf "OS=%s Perl=%s XML::Writer=%s\n",$^O,$^V,$XML::Writer::VERSION; my $writer = XML::Writer->new(); my $cContactPhone = 13824898944; my $cContactEmail = 'abctest@abc.com'; $writer->startTag("Contact", "Type" => "Information", "Phone" => $cContactPhone, "Email" => $cContactEmail ); $writer->characters('I am here to ask questions'); $writer->endTag("Contact");

output:

OS=MSWin32 Perl=v5.16.1 XML::Writer=0.625
<Contact Type="Information" Phone="13824898944" Email="abctest@abc.com">I am here to ask questions</Contact>
poj

Replies are listed 'Best First'.
Re^2: XML::Write challenges
by denzilhere (Initiate) on Feb 04, 2019 at 08:47 UTC

    Hi Poj, Thanks
    but it looks like I was not clear in my question.
    I need to print the both attribute key and value dynamically via XML:Writer. e.g. if $cContactPhone value is blank then the XML should be printed as below.

    <Contact Type="Information" Email="abctest@abc.com" Contact Name ="I a +m here to ask questions"</Contact>
    if $cContactEmail value is blank then it should print as below
    <Contact Type="Information" Phone="13824898944" Contact Name ="I am he +re to ask questions"</Contact>
    Thanks

      If you don't want something to appear in the output, don't tell the module to output it. Basically
      $attributes{"Type"} = $information if $information; $attributes{"Phone"} = $cContactPhone if $cContactPhone; $attributes{"Email"} = $cContactEmail if $cContactEmail; $self->xml->startTag("Contact", %attributes);

      Edit:
      Typo


      holli

      You can lead your users to water, but alas, you cannot drown them.

      If you have many attributes then consider map and grep

      #!/usr/bin/perl use strict; use XML::Writer; my $writer = XML::Writer->new(); my %obj = ( Type => 'Information', Phone => 0, Email => '', ); my %attr = map { $_ => $obj{$_} } grep { length $obj{$_} } keys %obj; $writer->startTag("Contact",%attr);
      poj

        Well done, poj, I find these scripts elegant. The ultimate one sidesteps values that perl thinks has zero length and is not too complex in its map/grep behavior that an intermediate learner can't reason through it.

        $ pt 2.xml_writer.pl $ ./2.xml_writer.pl OS=linux Perl=v5.26.1 XML::Writer=0.625 <Contact Type="Information" Phone="13824898944" Email="abctest@abc.com +">I am here to ask questions</Contact> ---------- <Contact Phone="0" Type="Information" Email="tja@greeninterweb"> ---------- <Contact Email="tja@greeninterweb" Type="Intfermation">Phone is so las +t millenium</Contact> $ cat 2.xml_writer.pl #!/usr/bin/perl -w use 5.011; use XML::Writer; printf "OS=%s Perl=%s XML::Writer=%s\n", $^O, $^V, $XML::Writer::VERSI +ON; my $writer = XML::Writer->new(); my $cContactPhone = 13824898944; my $cContactEmail = 'abctest@abc.com'; $writer->startTag( "Contact", "Type" => "Information", "Phone" => $cContactPhone, "Email" => $cContactEmail ); $writer->characters('I am here to ask questions'); $writer->endTag("Contact"); print "\n----------\n"; my $writer2 = XML::Writer->new(); my %obj = ( Type => 'Information', Phone => 0, Email => 'tja@greeninterweb', ); my %attr = map { $_ => $obj{$_} } grep { length $obj{$_} } keys %obj; $writer2->startTag( "Contact", %attr ); print "\n----------\n"; my $writer3 = XML::Writer->new(); %obj = ( Type => 'Intfermation', Phone => '', Email => 'tja@greeninterweb', ); %attr = map { $_ => $obj{$_} } grep { length $obj{$_} } keys %obj; $writer3->startTag( "Contact", %attr ); $writer3->characters('Phone is so last millenium'); $writer3->endTag("Contact"); print "\n"; __END__ $

        What applications would this have? It seems like xml is everywhere now that I'm looking at it, even the walls of the monastery!