繁体   English   中英

按XML元素的属性值排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM