in reply to Ordered XML items (XML::Simple?)

At first i thought that simply adding forcearray => 1 would do the trick, but it does not. The problem seems to be in your design. Try something like

<lists>
<list params="123">First</list>
<list params="456">Second</list>
</lists>
in combination with forcearray => 1. Here is some code to play with:
use strict; use warnings; use XML::Simple; use Data::Dumper; $Data::Dumper::Indent = 1; my $xml = XMLin(\*DATA, forcearray => 1); print Dumper $xml; __DATA__ <xml> <tabs> <tab name="foo"> <flag name="one" params="123">First</flag> <list name="two" params="456">Second</list> <list name="three" params="abc">Third</list> </tab> </tabs> <lists> <list params="123">First</list> <list params="456">Second</list> </lists> </xml>
The important output:

  'lists' => [
    {
      'list' => [
        {
          'params' => '123',
          'content' => 'First'
        },
        {
          'params' => '456',
          'content' => 'Second'
        }
      ]
    }
looks like it preserved the order. :)

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)

Replies are listed 'Best First'.
Re: (jeffa) Re: Ordered XML items (XML::Simple?)
by traveler (Parson) on Jan 17, 2003 at 16:55 UTC
    Thanks jeffa. I had tried something similar, but instead of forcearray=>1 I used forecarray['lists']. I could not get it to work. Unfortunately this solution fails on
    <lists> <list name="one" params="456">First</list> <flag name="two" params="123">Second</flag> <list name="three" params="abc">Third</list> <lists>
    When I tried it like this, it separated the lists and the flag into separate hashes in the array. I want the user to be able to specify any order (and there will be other tags, e.g. entry, title.

    --traveler

      Looks like the problem is in the design and not the tool. Question: are lists, entries, and titles types of tags, or are they something else? If you want them to be tags, then make them common tags that can have different attributes:
      <?xml version="1.0" encoding="UTF-8"?> <tags> <tag type="title" params="blah">Zero</tag> <tag type="list" params="123">First</tag> <tag type="entry" params="456">Second</tag> <tag type="flag" params="123">Third</tag> </tags>
      When run through the same code, this output is generated:
      $VAR1 = { 'tags' => [ { 'tag' => [ { 'params' => 'blah', 'content' => 'Zero', 'type' => 'title' }, { 'params' => '123', 'content' => 'First', 'type' => 'list' }, { 'params' => '456', 'content' => 'Second', 'type' => 'entry' }, { 'params' => '123', 'content' => 'Third', 'type' => 'flag' } ] } ] };
      There are advantages to both approaches. This approach allows you to preserve the order of your 'tags', but the other approach allows you to drill-down to a specific list of tags in O(1).

      jeffa

      L-LL-L--L-LL-L--L-LL-L--
      -R--R-RR-R--R-RR-R--R-RR
      B--B--B--B--B--B--B--B--
      H---H---H---H---H---H---
      (the triplet paradiddle with high-hat)
      
        Thanks, jeffa. I thought I'd tried that, but apparently not exactly that... Anyway, that will work. I'm glad to still be able to use a tool I'm used to. Since this is only parsed once in the application, it is ok to have to dig deeper for the data.

        --traveler