in reply to Re: Read the attribute from xml file
in thread Read the attribute from xml file

#!/usr/bin/perl use strict; use warnings; use XML::Simple; use Data::Dumper ; my $xml_Event = XMLin('EventDescription.xml'); warn "$xml_Event->{Event};

Replies are listed 'Best First'.
Re^3: Read the attribute from xml file
by Athanasius (Archbishop) on Jul 20, 2015 at 14:50 UTC

    Hello bhushanQA,

    The XML you’ve shown is not valid, as the <Event> element has no closing tag. When that is added, reading the XML is fairly straightforward. I’m not sure exactly what you’re trying to do; this is my best guess:

    #! perl use strict; use warnings; use XML::Simple; my $xml = do { local $/; <DATA>; }; my $xml_Event = XMLin($xml); for (keys %{ $xml_Event->{attribute} }) { printf "'%s' is %srequired\n", $_, $xml_Event->{attribute}{$_}{required} =~ /true/i ? '' : 'no +t '; } __DATA__ <Event name="Constants" id="0" ui-visible="0" version="0" serviceKey=" +0" rateTableName=""> <properties> <visible> false </visible> </properties> <attribute identifier="00"> <name> session_id </name> <type> string </type> <required> true </required> <ilog> <alternate> session id in string format </alternate> <visible> false </visible> </ilog> </attribute> <attribute identifier="01"> <name> volume </name> <type> int </type> <required> false </required> <ilog> <alternate> the volume </alternate> <visible> false </visible> </ilog> </attribute> </Event>

    Output:

    0:40 >perl 1313_SoPW.pl ' volume ' is not required ' session_id ' is required 0:40 >

    But please note the following from the documentation for XML::Simple:

    STATUS OF THIS MODULE

    The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces. In particular, XML::LibXML is highly recommended.

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Hahaha with style :)
      while( my( $att, $attref ) = %{ $event->{attribute} }){ print "$att required " if $attref->{required}; }
        and typos, oh boy
        while( my( $att, $attref ) = each %{ $event->{attribute} }){ print "$att required " if $attref->{required}; }
      Hi.. I have written my own code, right now I am able to print the whole file:
      #!/usr/bin/perl use strict; use warnings; use XML::Simple; use Data::Dumper ; my $xml_Event = XMLin('EventDescription.xml', KeyAttr =>{Event => 'nam +e'}); my $Event = $xml_Event->{Event}; print Dumper($Event);
      Now I want to print name and required field, How will I do that ??
Re^3: Read the attribute from xml file
by GotToBTru (Prior) on Jul 20, 2015 at 14:55 UTC

    First suggestion: use XML::Twig instead of XML::Simple. There are some good tutorials out there.

    XML::Simple reads in the XML data into a Perl data structure, but doesn't seem to give much help in working with it. If you use Data::Dumper you can print out the data structure and go from there. You'll get good with hash references!

    In my own exploration, I found the following produced a more useful data structure than the default:

    my $xml = XML::Simple; my $data = $xml->XMLin($filename, KeyAttr=>['identifier']);

    In that way, the key to the hash containing the attributes is the identifier.

    Dum Spiro Spero
      Hi.. I have written my own code, right now I am able to print the whole file:
      #!/usr/bin/perl use strict; use warnings; use XML::Simple; use Data::Dumper ; my $xml_Event = XMLin('EventDescription.xml', KeyAttr =>{Event => 'nam +e'}); my $Event = $xml_Event->{Event}; print Dumper($Event);
      Now I want to print name and required field, How will I do that ?? all content stored in variable.
        'use of this module in new code is discouraged'. Did you read the docs? Dumping the file you read isn't what you want.

        I'm not here to write programs for you. Check out this for help in working with references.

        $VAR1 = { 'name' => 'Constants', 'attribute' => [ { 'identifier' => '00', 'required' => ' true ', 'name' => ' session_id ', 'type' => ' string ', 'ilog' => { 'visible' => ' false ', 'alternate' => ' session id in st +ring format ' } }, { 'identifier' => '01', 'required' => ' false ', 'type' => ' int ', 'name' => ' volume ', 'ilog' => { 'alternate' => ' the volume ', 'visible' => ' false ' } } ], 'properties' => { 'visible' => ' false ' }, 'serviceKey' => '0', 'version' => '0', 'ui-visible' => '0', 'id' => '0', 'rateTableName' => '' };

        In your program, $Event is a hash reference. The data you want is under the attribute key. So you'd start with $Event->{attribute}. That is an array ref. Each element of that array is ANOTHER hash ref. 'name' and 'required' are keys in that hash.

        What I usually do in this situation is run the program in the debugger. Then I can incrementally build the expression that gets to the data I need.

        If you're thinking 'wow, this is alot of work', well yeah it is. That's why you should invest the time to learn a real XML module instead of XML::Simple.

        Dum Spiro Spero