Andrej Kastrin am Montag, 3. Juli 2006 21:08:
> Dear Perl community

Hi Andrej

> I have to parse ID, TITLE and SYMBOL fields from the file below. In this
> manner I wrote (modify actually) simple script to do that for me.
>
> <?xml version='1.0'?>
> <entries>
>   <entry>
>     <id>001</id>
>     <title>FIRST TITLE</title>
>     <symbol>SYMBOL AAA</symbol>
>     <symbol>SECOND CCC</symbol>
>   </entry>
>   <entry>
>     <id>002</id>
>     <title>SECOND TITLE</title>
>     <symbol>SYMBOL HHH</symbol>
>   </entry>
> </entries>
>
> Script below work well, if there is only one <symbol> field in each
> entry. I have some troubles to implement second foreach structure to
> loop through each symbol field and print it.
>
> Thanks in advance for any help,
> -------------------------------------

> #!/usr/bin/perl

use strict;
use warnings; 

# and declare your variables with my,...

> # use module
> use XML::Simple;
> # create object
> $xml = new XML::Simple (KeyAttr=>[]);

# ...for example here:

my $xml = new XML::Simple (KeyAttr=>[]);

> # read XML file
> $data = $xml->XMLin("example.xml");
> # access XML data
> foreach $e (@{$data->{entry}}){
> $id=$e->{id};
> $title=$e->{title};
> $symbol=$e->{symbol};
> print "$id|$title|$symbol\n";
> }

The script generates following output:

001|FIRST TITLE|ARRAY(0x84ee214)
002|SECOND TITLE|SYMBOL HHH

The 'ARRAY(0x84ee214)' part indicates that in the $symbol variable you're 
printing out is not a string, but an arrayref - containing multiple symbol 
entries. (you can check that, and inspect any nested data structure,  with 
the Data::Dumper module).

So, $symbol can contain a scalar (string) or an arrayref containing (string) 
scalars, depending of the number of symbol tags in the xml-document.

You get what you want by modifying the print line, for example:

print "$id|$title|", 
      ref($symbol) # or (ref($symbol) eq 'ARRAY')
         ? join ',', @$symbol # arrayref in $symbol
         : $symbol,            # scalar in $symbol
      "\n";

You may need another format for multiple value entries than a comma separated 
list. 

Hm, or do you need to repeat the parent tag path in such a case? Like:
001|FIRST TITLE|SYMBOL AAA
001|FIRST TITLE|SECOND CCC
Then forget my modified print statement :-)
(Your question is not clear to me in that respect)

Hope this helps,

Dani

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to