免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5447 | 回复: 7
打印 上一主题 下一主题

不采用module,怎么把xml转化成hash结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-28 10:26 |只看该作者 |倒序浏览
不用 xml::simple, 怎么得到hash结构。
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <note>
  3. <to>George</to>
  4. <from>John</from>
  5. <heading>Reminder</heading>
  6. <body>Don't forget the meeting!</body>
  7. <info>
  8. <info1>lv1</info1>
  9. <info2>
  10.     <tel>010888888</tel>
  11.     <addr>beijing</addr>
  12. </info2>
  13. </info>
  14. </note>
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-08-28 11:37 |只看该作者
本帖最后由 py 于 2013-08-28 11:38 编辑

为什么不用模块?

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
3 [报告]
发表于 2013-08-28 11:54 |只看该作者
xml是反人类的,有模块不用,那是反人类中的反人类。

论坛徽章:
0
4 [报告]
发表于 2013-08-28 13:20 |只看该作者
和模块有仇?

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
5 [报告]
发表于 2013-08-28 14:32 |只看该作者
看xml::simple的源码呗,用它里面的函数。{:3_188:}

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-08-29 04:11 |只看该作者
:
  1. #!/usr/bin/perl
  2. use 5.018;
  3. sub P {
  4.     local $_ = join '', map { s/^\s+//; s/\s+$//; $_ } @_;
  5.     s/<\?.*?\?>//; s/(?<=[^>])<\/\w+>/",/g;
  6.     s/<\/\w+>/},/g; s/></",{"/g; s/>/","/g;
  7.     s/</"/g; s/.*?{/{/; eval;
  8. }

  9. my %note = %{ P <DATA> };
  10. say $note{to};
  11. say $note{info}{info2}{tel};
  12. __DATA__
  13. <?xml version="1.0" encoding="ISO-8859-1"?>
  14. <note>

  15. <to>George</to>
  16. <from>John</from>
  17. <heading>Reminder</heading>
  18. <body>Don't forget the meeting!</body>
  19. <info>
  20.   
  21. <info1>lv1</info1>
  22. <info2>
  23.     <tel>010888888</tel>
  24.     <addr>
  25.     beijing
  26.    
  27.     </addr>
  28.    
  29. </info2>
  30. </info>

  31. <to2>Mary</to2>
  32. </note>
复制代码
  1. George
  2. 010888888
复制代码
hash结构:
  1. { to2 => Mary, to => George, from => John, heading => Reminder, body => Don't forget the meeting!, info => { info1 => lv1, info2 => { addr => beijing, tel => 010888888 } } }
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-08-30 16:48 |只看该作者
回复 2# py


    生产环境下不允许安装 xml simple :)

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
8 [报告]
发表于 2013-09-01 22:28 |只看该作者
本帖最后由 rubyish 于 2013-09-01 18:31 编辑

只支持 LZ 这种简单格式的 xml 文件:
  1. #!/usr/bin/perl
  2. use 5.018;

  3. sub tohash {
  4.     my $xml = shift;
  5.     open my $F, $xml or die "Can't open $xml: $!";
  6.     my @KV = map { s/^\s+//; s/\s+$//; split /(?<=>)(.*)(?=<)/ } <$F>;
  7.     sub {
  8.         my ( @X, $K ) = [];
  9.         for (@_) {
  10.             push $X[-1], $_;
  11.             /^<(\w+)>/ && !$K
  12.             ? $K = $1 : /<\/$K>/ ? push(@X, []) && undef $K : undef;
  13.         }
  14.         map {
  15.             my ($k) = $_->[0] =~ /<(.*)>/;
  16.             @$_ == 3
  17.             ? ( $k, $_->[1] ) : ( $k, { __SUB__->( @$_[ 1 .. @$_ - 2 ] ) } )
  18.         } @X[ 0 .. @X - 2 ];
  19.     } ->( @KV[ 2 .. @KV - 2 ] );
  20. }

  21. my %h = tohash '/tmp/z.xml';
  22. say $h{info}{info2}{tel};
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP