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

This node was taken out by the NodeReaper on Dec 30, 2015 at 08:04 UTC
  • Comment on Reaped: Basic parsing XML perl - using FOREACH

Replies are listed 'Best First'.
Re: Basic parsing XML perl - using FOREACH
by 1nickt (Canon) on Dec 30, 2015 at 06:08 UTC

    null

    Edit: Since the original node was considered for reaping and replaced with a properly formatted one while I was composing a reply, I deleted it from here and posted in the valid thread, with the goal of not extending the life of the reaped thread. So much for that :P

      See Why shouldn't I delete a node or its content? in How do I change/delete my post?

      Originally this is what 1nickt's posted instead of "null"

      First, please enclose your code and data inside <code></code> tags. It's almost impossible to read otherwise.

      Second, please post working code. You typed in some code that has an error (@xml and $data have their sigils transposed); it makes it hard to help you when you don't paste your actual code here.

      Third, you must use strict; and use warnings; in your programs, otherwise you are rejecting Perl's built-in safety features, and there's not much point in helping when a programmer is doing that.

      Finally, for your question, XML::Simple maybe "best" for you, but not if you want correct results. It has a lot of limitations (see its own documentation), including in this way: it will only return one element when one or more have the same key:

      #!/usr/bin/perl use strict; use warnings; use XML::Simple; use Data::Dumper; my $xml=new XML::Simple; local $/; my @data= $xml->XMLin( <DATA> ); print Dumper(\@data); __DATA__ <?xml version='1.0'?> <staff> <employee> <name>Pradeep</name> <age>23</age> <sex>M</sex> <department>Coder</department> </employee> <employee> <name>Pradeep</name> <age>22</age> <sex>M</sex> <department>HR</department> </employee> </staff>
      Output:
      $VAR1 = [ { 'employee' => { 'Pradeep' => { 'department' => 'HR', 'age' => '22', 'sex' => 'M' } } } ];
      It works fine when the keys are distinct:
      #!/usr/bin/perl use strict; use warnings; use XML::Simple; use Data::Dumper; my $xml=new XML::Simple; local $/; my @data= $xml->XMLin( <DATA> ); print Dumper(\@data); __DATA__ <?xml version='1.0'?> <staff> <employee> <name>Pradeep</name> <age>23</age> <sex>M</sex> <department>Coder</department> </employee> <employee> <name>Douglas</name> <age>22</age> <sex>M</sex> <department>HR</department> </employee> </staff>
      Output:
      $VAR1 = [ { 'employee' => { 'Pradeep' => { 'age' => '23', 'department' => 'Coder', 'sex' => 'M' }, 'Douglas' => { 'age' => '22', 'sex' => 'M', 'department' => 'HR' } } } ];

      Many monks recommend using XML::Twig or XML::LibXML instead.


      The way forward always starts with a minimal test.

      when you say "you must use strict; and use warnings; "

      you must enumerate the problems in OPs code that would be caught by use strict; use warnings;