[英]Sorting XML elements by their attribute values
我有以下XML
<?xml version="1.0" encoding="UTF-8"?>
<Objects >
<Item1 elemId="id1" name="view" sort_id="3">
</Item1>
<Item2 elemId="id3" name="view" sort_id="4" >
</Item2>
<Item3 elemId="id5" name="view" sort_id="2">
</Item3>
<Item4 elemId="id9" name="view" sort_id="1">
</Item4>
</Objects>
我想通过属性sort_id
对该数据进行排序以获取以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Objects >
<Item4 elemId="id9" name="view" sort_id="1">
</Item4>
<Item3 elemId="id5" name="view" sort_id="2">
</Item3>
<Item1 elemId="id1" name="view" sort_id="3">
</Item1>
<Item2 elemId="id3" name="view" sort_id="4" >
</Item2>
</Objects>
我知道我无法使用XML::Simple
做到这一点,但听说可以使用XML::LibXML
进行排序。 我找不到解决方案。
XML::LibXML
内置没有专门提供排序元素的内容,但是使用可用的API却很简单
这样的事情会做你想要的。 不幸的是,尽管XML::LibXML
完美且有效,但它并不能很好地产生整洁的输出。 如果您想要更漂亮的东西,那么应该看一下XML::LibXML::PrettyPrint
,它将为您完成此工作
use strict;
use warnings 'all';
use XML::LibXML;
my $doc = XML::LibXML->load_xml(location => 'sort_xml.xml');
my ($objects) = $doc->findnodes('/Objects');
my @items = $objects->findnodes('*');
@items = sort {
$a->getAttribute('sort_id') <=> $b->getAttribute('sort_id')
} @items;
$objects->removeChildNodes;
$objects->appendChild( $_ ) for @items;
print $doc;
<?xml version="1.0" encoding="UTF-8"?>
<Objects><Item4 elemId="id9" name="view" sort_id="1">
</Item4><Item3 elemId="id5" name="view" sort_id="2">
</Item3><Item1 elemId="id1" name="view" sort_id="3">
</Item1><Item2 elemId="id3" name="view" sort_id="4">
</Item2></Objects>
要使用XML::LibXML::PrettyPrint
,您需要添加
use XML::LibXML::PrettyPrint;
在程序顶部,然后替换
print $doc;
同
my $pp = XML::LibXML::PrettyPrint->new(indent_string => " ");
$pp->pretty_print($doc);
print $doc;
<?xml version="1.0" encoding="UTF-8"?>
<Objects>
<Item4 elemId="id9" name="view" sort_id="1"/>
<Item3 elemId="id5" name="view" sort_id="2"/>
<Item1 elemId="id1" name="view" sort_id="3"/>
<Item2 elemId="id3" name="view" sort_id="4"/>
</Objects>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.