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

Dear monks

I am using XML::Simple to translate a hash to xml. i then need to validate the XML using and schema. the schema forces an order to the elements which i didnt manage to cancel so i want to generate the xml in the same order listed by the schema

i tried modifying the sorted_keys() hook but that approach has one 2 major disadvantages. first i have to duplicate info that exists in the schema. second it causes XMLout to generate empty attributes in case there is no hash entry

How can i sort the elements based on the order required in the schema?

Is there a module that can do that?

From another angle, how can i disable the ordering requirement in my schema? . the only option i found is to switch the sequence to unbounded choice but that ruins my validation

Your help is appreciated

Replies are listed 'Best First'.
Re: Sort xml nodes by schema
by tobyink (Canon) on Sep 10, 2013 at 09:14 UTC

      No problem i am moving!

      But, do you know how to sort elements according to schema using XML::LibXML ?

Re: Sort xml nodes by schema
by AlexTape (Monk) on Sep 10, 2013 at 09:20 UTC


      Suppress empty does ease the pain

      I have another issue i forgot to mention

      i need a certain key value pair to translate to an element rather than an attribute

      is there a way to do that with XML::Simple ?

        can you give an example?
        $perlig =~ s/pec/cep/g if 'errors expected';
Re: Sort xml nodes by schema
by AlexTape (Monk) on Sep 11, 2013 at 08:25 UTC
    fyi: something crosses my mind this morning
    you can output a hash in the same order as you inserted elements into it
    use Tie::IxHash; tie %hash, "Tie::IxHash"; $hash{any1}="first"; $hash{some1}="second"; $hash{big1}="third"; foreach $foo (keys %hash) { print " $foo\n"; } while (( $foo, $bar ) = each %hash ) { print "$foo is $bar"; }
    output should be:
    >any1 is first
    >some1 is second
    >big1 is third
    maybe XML::Simple adopt that.. dnt knw..

    kindly perlig

    $perlig =~ s/pec/cep/g if 'errors expected';