免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3279 | 回复: 6

[求助] 一个XML文档排序问题 [复制链接]

论坛徽章:
0
发表于 2011-07-27 10:40 |显示全部楼层
处理前:
  1. <Garden>
  2.         <Apple id="110" name="AAA" permission="readwrite">
  3.                 <Banana type="uint32" sizeOf="1" name=""/>
  4.         </Apple>
  5.   <Apple id="10" name="BBB" maxIndex="1" permission="readwrite">
  6.                 <Banana type="uint8" sizeOf="1" name=""/>
  7.                 <Banana type="uint16" sizeOf="1" name=""/>
  8.         </Apple>
  9.         <Apple id="27" name="CCC" maxIndex="1" permission="readwrite">
  10.                 <Banana type="uint8" sizeOf="1" name=""/>
  11.                 <Banana type="uint32" sizeOf="1" name=""/>
  12.         </Apple>
  13.         <Apple id="23" name="DDD" maxIndex="91" permission="readwrite">
  14.                 <Banana type="uint8" sizeOf="1" name=""/>
  15.         </Apple>
  16. </Garden>
复制代码
处理后:
  1. <Garden>
  2.   <Apple id="10" name="BBB" maxIndex="1" permission="readwrite">
  3.                 <Banana type="uint8" sizeOf="1" name=""/>
  4.                 <Banana type="uint16" sizeOf="1" name=""/>
  5.         </Apple>
  6.         <Apple id="23" name="DDD" maxIndex="91" permission="readwrite">
  7.                 <Banana type="uint8" sizeOf="1" name=""/>
  8.         </Apple>
  9.         <Apple id="27" name="CCC" maxIndex="1" permission="readwrite">
  10.                 <Banana type="uint8" sizeOf="1" name=""/>
  11.                 <Banana type="uint32" sizeOf="1" name=""/>
  12.         </Apple>       
  13.         <Apple id="110" name="AAA" permission="readwrite">
  14.                 <Banana type="uint32" sizeOf="1" name=""/>
  15.         </Apple>
  16. </Garden>
复制代码
按照Apple元素的id属性,按照数值大小排序,按照从小到大(或者从大到小)的顺序输出。
Apple内嵌的Banana元素无需做处理,仅要保留每个Banana与Apple的父子关系。
请各位帮忙,share一下你的代码,谢谢。

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2011-07-27 11:17 |显示全部楼层
本帖最后由 jason680 于 2011-07-27 11:31 编辑
处理前:处理后:按照Apple元素的id属性,按照数值大小排序,按照从小到大(或者从大到小)的顺序输出。
A ...
Suchangyu 发表于 2011-07-27 10:40



$ cat sort_apple_id.pl

  1. use strict;
  2. use warnings;

  3. my $flgHead = 1;
  4. my $flgTail = 0;
  5. my($sHead, $sTail, $sID);
  6. my %hApple;

  7. while(<>){
  8.   $flgTail=1 if(m/^\s*<\/Garden>/);

  9.   if($flgTail == 1){
  10.     $sTail .= $_;
  11.     next;
  12.   }
  13.   if(m/^\s*<Garden>/){
  14.     $flgHead = 0;
  15.     $sHead .= $_;
  16.     next;
  17.   }
  18.   if($flgHead == 1){
  19.     $sHead .= $_;
  20.     next;
  21.   }
  22.   $sID = $1 if(m/^\s*<Apple id="(\d+)"/);

  23.   $hApple{$sID} .= $_;
  24. }

  25. print $sHead;
  26. print $hApple{$_} foreach(sort {$a<=>$b} keys %hApple);
  27. print $sTail;
复制代码
$ perl sort_apple_id.pl fruit.xml
<Garden>
  <Apple id="10" name="BBB" maxIndex="1" permission="readwrite">
                <Banana type="uint8" sizeOf="1" name=""/>
                <Banana type="uint16" sizeOf="1" name=""/>
        </Apple>
        <Apple id="23" name="DDD" maxIndex="91" permission="readwrite">
                <Banana type="uint8" sizeOf="1" name=""/>
        </Apple>
        <Apple id="27" name="CCC" maxIndex="1" permission="readwrite">
                <Banana type="uint8" sizeOf="1" name=""/>
                <Banana type="uint32" sizeOf="1" name=""/>
        </Apple>
        <Apple id="110" name="AAA" permission="readwrite">
                <Banana type="uint32" sizeOf="1" name=""/>
        </Apple>
</Garden>

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-27 12:48 |显示全部楼层
  1. perl -aF"\"" -lne 'if(/<Apple/){$s=$F[1];$arr{$s}.=$_}elsif($F[1]!~$s){$arr{$s}.="\n".$_};END{print "    <Garden>";foreach (sort {$a<=>$b} keys %arr){print $arr{$_}};print "    </Garden>"}' xml
复制代码

论坛徽章:
0
发表于 2011-07-27 15:23 |显示全部楼层
##献丑

#!/usr/bin/perl -w

use strict;
use warnings;

my @apple;

{ local $/;
    @apple = split /(?:<Garden>|\bApple>)\r?\n/, <DATA>;
}

shift @apple;
my $footer = pop @apple;

@apple = map { $_->[0] }
        sort { $a->[1] <=> $b->[1] }
        map { [ $_, &appleID($_) ] }
        @apple ;

sub appleID {
    my ($id) = $_[0]=~/<apple id="(\d+)/i;
    return $id;
}

print "<Garden>\n";
print $_  ."Apple>\n" for @apple;
print $footer, "\n";


__DATA__
    <Garden>
            <Apple id="110" name="AAA" permission="readwrite">
                    <Banana type="uint32" sizeOf="1" name=""/>
            </Apple>
      <Apple id="10" name="BBB" maxIndex="1" permission="readwrite">
                    <Banana type="uint8" sizeOf="1" name=""/>
                    <Banana type="uint16" sizeOf="1" name=""/>
            </Apple>
            <Apple id="27" name="CCC" maxIndex="1" permission="readwrite">
                    <Banana type="uint8" sizeOf="1" name=""/>
                    <Banana type="uint32" sizeOf="1" name=""/>
            </Apple>
            <Apple id="23" name="DDD" maxIndex="91" permission="readwrite">
                    <Banana type="uint8" sizeOf="1" name=""/>
            </Apple>
    </Garden>

论坛徽章:
0
发表于 2011-07-28 21:06 |显示全部楼层
我同事有一个很牛X的答案,一句代码就可以实现。他原话是这样的:直接print出来就行了,还费什么劲。。。
我表示鸭梨很大~~~

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2011-07-28 21:38 |显示全部楼层
直接用 RE 做的都是神

论坛徽章:
0
发表于 2011-07-28 23:49 |显示全部楼层
$ cat sort_apple_id.pl$ perl sort_apple_id.pl fruit.xml

  
               
             ...
jason680 发表于 2011-07-27 11:17



    写java的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP