XML :: Twig对属性(perl)上的子项进行排序

时间:2018-03-26 13:08:36

标签: perl xml-twig

您好,

我需要使用带有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>

排序后所需的顺序需要是:

<Entries>
    <datatag1 a="A1">
        <t>A</t>
    </datatag1>
    <datatag1 a="C1">
        <t>1</t>
    </datatag1>
    <datatag1 a="F1">
        <t>14</t>
    </datatag1>
    <datatag1 a="AB1">
        <t>1</t>
    </datatag1>
    <datatag1 a="ABA1">
        <t>D</t>
    </datatag1>
</Entries>

然而按字母排序使用:

$root->sort_children_on_att('a');

没有给出预期的结果。这是预期的,按字母顺序AB跟随A.是否有任何其他方法使用XML :: Twig进行排序以获得所需的结果?

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:1)

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

#!/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;