XML::Twig 按属性排序 children (perl)
XML::Twig sort children on attribute (perl)
嗨,
我需要使用带有 XML::Twig 的 "a" 属性对 "Entries" 元素的 children 进行排序,但找不到这样做的方法。结构如下:
<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 进行排序以获得所需的结果?
非常感谢任何帮助。
Twig 的排序方法不接受自定义排序方法,但您始终可以使用 Perl 的 sort 和 cut/paste 节点:
#!/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;
嗨,
我需要使用带有 XML::Twig 的 "a" 属性对 "Entries" 元素的 children 进行排序,但找不到这样做的方法。结构如下:
<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 进行排序以获得所需的结果?
非常感谢任何帮助。
Twig 的排序方法不接受自定义排序方法,但您始终可以使用 Perl 的 sort 和 cut/paste 节点:
#!/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;