in reply to Reaped: Basic parsing XML perl - using FOREACH

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

  • Comment on Re: Basic parsing XML perl - using FOREACH

Replies are listed 'Best First'.
Re^2: Basic parsing XML perl - using FOREACH
by Anonymous Monk on Jan 01, 2016 at 08:52 UTC

    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.
Re^2: Basic parsing XML perl - using FOREACH ( warnings; )
by Anonymous Monk on Dec 30, 2015 at 06:26 UTC

    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;