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

Hi,

I have the following XML that I want to sort by 'TabOrder':

<?xml version="1.0" encoding="windows-1252"?> <TPersonId name="PersonId" type="inherited"> <TcxTabSheet name="cxTabSheetIdentity" type="object"> <TScrollBox name="ScrollBox2" type="object"> <TabOrder type="shortint">2</TabOrder> <TcxDBDateEdit name="cxDBDateEdit4" type="object"> <TabOrder type="shortint">2</TabOrder> </TcxDBDateEdit> <TcxDBDateEdit name="cxDBDateEdit3" type="object"> <TabOrder type="shortint">1</TabOrder> </TcxDBDateEdit> </TScrollBox> <TScrollBox name="ScrollBox1" type="object"> <TabOrder type="shortint">1</TabOrder> <TcxDBDateEdit name="cxDBDateEdit2" type="object"> <TabOrder type="shortint">2</TabOrder> </TcxDBDateEdit> <TcxDBDateEdit name="cxDBDateEdit1" type="object"> <TabOrder type="shortint">1</TabOrder> </TcxDBDateEdit> </TScrollBox> </TcxTabSheet> </TPersonId>

The following perl script does what I want, but it also issues two identical warnings - Argument "" isn't numeric in numeric comparison (<=>) - how do I prevent the script from attempting to sort children who do not have a TabOrder? (which is what I assume is going on)

use strict; use warnings; use XML::Twig; my $twig = XML::Twig -> new(pretty_print => 'indented'); $twig->parsefile('test.xml'); foreach my $element($twig -> get_xpath('.//')){ $element -> sort_children_on_field('TabOrder', type => 'numeric'); } $twig -> print;
map{$a=1-$_/10;map{$d=$a;$e=$b=$_/20-2;map{($d,$e)=(2*$d*$e+$a,$e**2 -$d**2+$b);$c=$d**2+$e**2>4?$d=8:_}1..50;print$c}0..59;print$/}0..20
Tom Melly, mellytom2 (at) gmail (stop) com

Replies are listed 'Best First'.
Re: Twig - sorting XML error
by choroba (Cardinal) on Sep 24, 2024 at 13:35 UTC
    Use the more general sort_children, provide a subroutine that returns the TabOrder if it exists, and zero otherwise:
    $element->sort_children(sub { my ($elt) = @_; my $to = $elt->first_child('TabOrde +r'); $to ? $to->text : 0 }, type => 'numeric');
    map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]