http://www.perlmonks.org?node_id=606552

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

Hi Monks, i used the following code to get the xml contents from a file. when i use this i am getting only the first para in that file. actually there are 2 paragraphs. Please spot me where i am wrong.
use XML::Twig; my $file = "C:/test2.xml"; my $tmp; $tmp = XML::Twig->new(); $tmp->parsefile($file); my $root = $tmp->root; foreach my $product($root->children('doc')){ my @para=$product->first_child_text('para'); print @para; }
test2.xml
<para>aaaaaaaaaaaaaaaaa dsnbbtejk</para> <para>aldmflskddddddddddddddddddffffffffffffff</para>
</code>

Replies are listed 'Best First'.
Re: reading from xml files
by davorg (Chancellor) on Mar 26, 2007 at 11:33 UTC

    Firstly, your sample XML isn't valid XML as it has no root node so I wouldn't expect it to parse at all. I've changed it to this:

    <doc> <para>aaaaaaaaaaaaaaaaa dsnbbtejk</para> <para>aldmflskddddddddddddddddddffffffffffffff</para> </doc>

    Secondly, you seem a little confused about which elements you are looking for. At one point you look for elements called 'doc', but there aren't any elements called that in your sample data.

    I think you want something more like this:

    use strict; use warnings; use XML::Twig; my $file = 'test.xml'; my $tmp; $tmp = XML::Twig->new(); $tmp->parsefile($file); my $root = $tmp->root; foreach my $product ($root->children('para')){ my $para = $product->first_child_text; print "$para\n"; }
    --

    See the Copyright notice on my home node.

    "The first rule of Perl club is you do not talk about Perl club." -- Chip Salzenberg

Re: reading from xml files
by RatKing (Acolyte) on Mar 26, 2007 at 11:51 UTC
    Ok this is just a thought but I see two equal lines in your file. With this I mean they are both top level, there is no child parent relation for that to be there one would have to be in side the other.
    <parent> <child> <second_child></second_child> </child> </parent>
    Rob.
Re: reading from xml files
by GrandFather (Saint) on Mar 26, 2007 at 22:17 UTC

    As others have pointed out your (not quite) XML data is not consistent with your code. The following sample may help:

    use strict; use warnings; use XML::Twig; my $xml = <<XML; <root> <para>aaaaaaaaaaaaaaaaa dsnbbtejk</para> <para>aldmflskddddddddddddddddddffffffffffffff</para> </root> XML my $tmp = XML::Twig->new(); $tmp->parse ($xml); my $root = $tmp->root; print $_->trimmed_text (), "\n" for $root->children ('para');

    Prints:

    aaaaaaaaaaaaaaaaa dsnbbtejk aldmflskddddddddddddddddddffffffffffffff

    DWIM is Perl's answer to Gödel