Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: request for help on working with XML::Simple

by spatterson (Pilgrim)
on Aug 07, 2009 at 16:55 UTC ( [id://786842]=note: print w/replies, xml ) Need Help??


in reply to request for help on working with XML::Simple

I believe this should work, XML::Simple all hinges on nested hash & array references.
my $sources = $ref->{'sas_residue_annotation'}->{'sources'}; foreach my $s (@{ $sources }) { print $s->{'source_name'}->[0], "\n"; }

just another cpan module author

Replies are listed 'Best First'.
Re^2: request for help on working with XML::Simple
by Angharad (Pilgrim) on Aug 07, 2009 at 17:05 UTC
    Thanks for the replies so far. Much appreciated!

    Here is an portion of the xml file as requested.

    <sas_residue_annotation xmlns="http://url/Schema" xmlns:xsi="http://ww +w.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://url/Sche +ma WSsas.xsd">> <sources> <source> <source_name>1iho</source_name> <ref_identity>47.20</ref_identity> <ref_overlap>282</ref_overlap> <ref_evalue>5.5e-50</ref_evalue> <ref_pmid>11377204</ref_pmid> </source> <source> <source_name>1mop</source_name> <ref_identity>43.60</ref_identity> <ref_overlap>264</ref_overlap> <ref_evalue>8.3e-38</ref_evalue> <ref_pmid>12717031</ref_pmid> </source> </sources> </sas_residue_annotation>
      Since you are new to XML, allow me to offer a different approach, based on XML::Twig, which, in my opinion, is no more difficult to learn than XML::Simple, and will work for a wider range of XML structures:
      use strict; use warnings; use XML::Twig; my $xmlStr = <<XML; <sas_residue_annotation xmlns="http://url/Schema" xmlns:xsi="http://ww +w.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://url/Sche +ma WSsas.xsd">> <sources> <source> <source_name>1iho</source_name> <ref_identity>47.20</ref_identity> <ref_overlap>282</ref_overlap> <ref_evalue>5.5e-50</ref_evalue> <ref_pmid>11377204</ref_pmid> </source> <source> <source_name>1mop</source_name> <ref_identity>43.60</ref_identity> <ref_overlap>264</ref_overlap> <ref_evalue>8.3e-38</ref_evalue> <ref_pmid>12717031</ref_pmid> </source> </sources> </sas_residue_annotation> XML my $twig= new XML::Twig( twig_handlers => { source_name => \&source_name } ); $twig->parse($xmlStr); exit; sub source_name { my ($twig, $name) = @_; print $name->text(), "\n"; } __END__ 1iho 1mop
Re^2: request for help on working with XML::Simple
by Angharad (Pilgrim) on Aug 07, 2009 at 17:15 UTC
    Well .. I'm not getting any errors but I'm not getting any results either for that I'm afraid :(

      I find XML::Simple to be very simple if the XML is very simple, but with non-trivial XML I am often surprised by what it produces and, if I persist with it, end up spending a lot of time re-reading the documentation and studying Data::Dumper dumps.

      Here is an example which shows, step by step as I worked it out, how to access the source_name element...

      use strict; use warnings; use Data::Dumper; my $VAR1 = { 'sas_residue_annotation' => [ { 'xmlns' => 'http://www.ebi.ac.uk/WSsas/Schema', 'sources' => [ { 'source' => [ { 'source_name' => [ '1iho' ], 'ref_evalue' => [ '5.5e-50' ], 'ref_overlap' => [ '282' ], 'ref_identity' => [ '47.20' ], 'ref_pmid' => [ '11377204' ] }, { 'source_name' => [ '1mop' ], 'ref_evalue' => [ '8.3e-38' ], 'ref_overlap' => [ '264' ], 'ref_identity' => [ '43.60' ], 'ref_pmid' => [ '12717031' ] }, { 'source_name' => [ '1n2b' ], 'ref_evalue' => [ '8.2e-38' ], 'ref_overlap' => [ '264' ], 'ref_identity' => [ '43.60' ], 'ref_pmid' => [ '12717031' ] }, ], }, ], }, ], }; print Dumper($VAR1); print Dumper($VAR1->{sas_residue_annotation}); print Dumper($VAR1->{sas_residue_annotation}[0]); print Dumper($VAR1->{sas_residue_annotation}[0]{sources}); print Dumper($VAR1->{sas_residue_annotation}[0]{sources}[0]); print Dumper($VAR1->{sas_residue_annotation}[0]{sources}[0]{source}); foreach my $source (@{$VAR1->{sas_residue_annotation}[0]{sources}[0]{s +ource}}) { print "source name: ", join(',',@{$source->{source_name}}), "\n"; }

      Note that I wrote each successive print after studying the output of the previous one. It is a bit tedious, but for deeply nested structures I find it faster than trying to do it all in my head and then debugging my errors.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://786842]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (3)
As of 2024-04-25 19:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found