in reply to XML::Simple parsing :-(

Sorry about that. I cant find a way to edit my original post though sorry :-/ Heres my original code though that reads in the xml file.
#!/usr/bin/perl -w use strict; use XML::Simple; use Data::Dumper; my $doc; open(FH, "inc.xml") || die "Can't open inc.xml"; sysread(FH, $doc, -s FH); close FH; my $xs = new XML::Simple; # can use forcearray and keeproot my $ref = $xs->XMLin("$doc"); # works print $ref->{incident}->{'GDOT-INC-260089'}->{location}->{county}->{co +ntent} . "\n"; # doesnt work print $ref->{'incident'}->[0];

Replies are listed 'Best First'.
Re: Re: XML::Simple parsing :-(
by graff (Chancellor) on Jun 20, 2003 at 03:12 UTC
    Based on this part of your post:
    # works print $ref->{incident}->{'GDOT-INC-260089'}->{location}->{county}->{co +ntent} . "\n"; # doesnt work print $ref->{'incident'}->[0];
    and this initial comment:

    basically I am having trouble forcing the incident into an array so I can call it like this:

    print $ref->{incident}->[0]->{location}->{county}->{content} . "\n";

    Why is it important to have the structure be set up as $ref->{incident}->[]->... ? Is it simply that you want to be able to access the incident reports via numeric array index rather than by name?

    Either there is some compelling reason (which you haven't explained yet) why you want a numeric array index at that particular level of the structure, or else you're asking for something that you don't really need.

    If the incident-id values are being created in such a way that they can easily be sorted into the most relevant order (chronological or whatever), then you can iterate over the hash keys in that desired order by sorting them into an array first:

    my @sorted_keys = sort keys %{$ref->{incident}}; for my $incid ( @sorted_keys ) { # do something with $$ref{incident}{incid} ... }
    If necessary, you could use a more elaborate sort function, including one that references the contents of lower layers in the structure (such as date/time, location or whatever), and this might be a good place to apply a Schwartzian Transform.
Re: Re: XML::Simple parsing :-(
by st4k (Novice) on Jun 19, 2003 at 21:45 UTC
    and here is the original xml:
    <?xml version="1.0" encoding="UTF-8"?> <!-- Incident report from the Georgia DOT's Navigator ITS. --> <!-- Visit us online at http://georgia-navigator.com/. --> <!-- Raw data available at http://georgia-navigator.com/data/. --> <!-- Copyright (c) 2002 Georgia DOT. All rights reserved. --> <incident-report timestamp="2003-06-19 15:56:03 EDT"> <incident id="GDOT-INC-252421" level="3" status="active"> <type id="8">Incident</type> <description>High impact, Roadway Damage, Pickens Co.</description +> <impact id="3">High</impact> <cleanup timestamp="2003-06-20 00:35:00 EDT">12:35 AM Tomorrow</cl +eanup> <lanes>All Lanes</lanes> <location> <type id="6">Arterial</type> <county id="227">Pickens</county> <coord projection="GA State Plane West" datum="NAD83" unit="mete +rs" x="670707" y="494686" /> <description>Southbound SR 53 AT MARBLE HILL(SINKHOLE -MP 25.3) +(PICKENS CO)</description> </location> </incident>
      Please read the documentation on XML::Simple, hm? Save us all a lot of time. It's a good module if you know how to use it.

      According to that documentation, you probably want the ForceArray option:

          my $ref = $xs->XMLin($doc, ForceArray => [ 'incident' ]);

      PS: You don't need quotes on $doc when you're passing it to the subroutine.

          -- Chip Salzenberg, Free-Floating Agent of Chaos

        Believe me I read the documentation before I post here. Its usually my last resort when I have to ask someone.
        Force array option doesnt do what I expected it to do. It just makes arrays out of the elements below the GDOT-INC-252421 portions of the tag. I have read the documentation and have used that option as well as the keeproot option just dont quite get why its not doing what I expected it to do.