Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
属性上的细枝排序子级(perl)_Perl_Xml Twig - Fatal编程技术网

属性上的细枝排序子级(perl)

属性上的细枝排序子级(perl),perl,xml-twig,Perl,Xml Twig,嗨 我需要使用XML::Twig的“a”属性对“Entries”元素的子元素进行排序,但找不到这样做的方法。结构如下: <Entries> <datatag1 a="A1"> <t>A</t> </datatag1> <datatag1 a="ABA1"> <t>D</t> </datatag1> <datata

我需要使用XML::Twig的“a”属性对“Entries”元素的子元素进行排序,但找不到这样做的方法。结构如下:

<Entries>
    <datatag1 a="A1">
        <t>A</t>
    </datatag1>
    <datatag1 a="ABA1">
        <t>D</t>
    </datatag1>
    <datatag1 a="C1">
        <t>1</t>
    </datatag1>
    <datatag1 a="F1">
        <t>14</t>
    </datatag1>
    <datatag1 a="AB1">
        <t>1</t>
    </datatag1>
</Entries>
没有给出期望的结果。这是预期的,因为字母顺序AB跟在A后面。是否有其他方法使用XML::Twig进行排序以获得所需的结果


非常感谢您的帮助。

Twig的排序方法不接受自定义排序方法,但您始终可以使用Perl并剪切/粘贴节点:

#!/usr/bin/perl
use warnings;
use strict;

use XML::Twig;

my $xml = '<Entries>...</Entries>';

sub sort_children {
    my $parent = $_;
    my @children = sort {
        length $a->att('a') <=> length $b->att('a')
        or $a->att('a') cmp $b->att('a')
    } $parent->cut_children;
    $_->paste(last_child => $parent) for @children;
}

my $twig = 'XML::Twig'->new(twig_handlers => { Entries => \&sort_children });
$twig->parse($xml);
$twig->print;
#/usr/bin/perl
使用警告;
严格使用;
使用XML::Twig;
我的$xml=“…”;
子类{
我的$parent=$\;
我的@children=sort{
长度$a->att('a')长度$b->att('a'))
或$a->att('a')cmp$b->att('a'))
}$parent->cut_children;
$\u->粘贴@children(最后一个孩子=>$parent);
}
my$twig='XML::twig'->new(twig\u处理程序=>{Entries=>\&sort\u children});
$twig->parse($xml);
$twig->print;

请提供完整的程序供我们测试。
$root->sort_children_on_att('a');
#!/usr/bin/perl
use warnings;
use strict;

use XML::Twig;

my $xml = '<Entries>...</Entries>';

sub sort_children {
    my $parent = $_;
    my @children = sort {
        length $a->att('a') <=> length $b->att('a')
        or $a->att('a') cmp $b->att('a')
    } $parent->cut_children;
    $_->paste(last_child => $parent) for @children;
}

my $twig = 'XML::Twig'->new(twig_handlers => { Entries => \&sort_children });
$twig->parse($xml);
$twig->print;