博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Perl 用XML::Simple解析XML文件
阅读量:5796 次
发布时间:2019-06-18

本文共 2507 字,大约阅读时间需要 8 分钟。

hot3.png

在Perl中解析XML的方法最常见的就是使用  和 XML::Simple了。 XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。 

对于小型且不复杂的XML文件,XML::DOM真是杀鸡用牛刀。 这时就轮到轻便的XML::Simple上场了。

XML::Simple如其名,真的很简单。假设XML内容如下:

This is a test.

那么只需这样写:

use XML::Simple;use Data::Dumper;$xml = XMLin('sample.xml');print Dumper($xml);

就可以轻而易举地将XML解析成一个hash,然后用foreach依次处理即可。

$VAR1 = {          'text' => 'This is a test.',          'user' => [                    {                      'fullname' => 'Gary R Epstein',                      'login' => 'grep'                    },                    {                      'session' => {                                   'pid' => '12345'                                 },                      'fullname' => 'Simon T Tyson',                      'login' => 'stty'                    }                  ]        };

可以发现如下规律:

  • 元素的标签名被用于hash的key。
  • 单个元素的内容作为hash的value,多个重复的元素的内容被放到一个数组引用中作为hash的value
  • 属性和子元素都以hash的key=>value对出现在元素的内容中

一个问题是,对单个元素和多个重复元素的处理结果不一致,就会导致foreach处理时比较麻烦 (需要区分是标量还是数组引用),如上面的 text 和 user 的值。 解决方法是添加选项 ForceArray => 1,就可以强制单个元素也放到数组引用中。

$xml = XMLin('sample.xml', ForceArray => 1);print Dumper($xml);

运行结果(部分):

$VAR1 = {          'text' => [                    'This is a test.'                  ],          'user' => [......

另一个问题是,如果你的元素属性中包含id、name或key,那么元素就不再放到数组引用中,而是放到 hash引用中。比如下面的XML,注意与上面的结果的区别:

This is a test.
$VAR1 = { 'text' => [ 'This is a test.' ], 'user' => { 'grep' => { 'fullname' => 'Gary R Epstein' }, 'stty' => { 'session' => [ { 'pid' => '12345' } ], 'fullname' => 'Simon T Tyson' } } };

user的内容不再是数组引用,而是hash引用,而id='grep'也变成了key存在。

要想禁用这个功能,应当指定选项 KeyAttr => ''。这个选项就是说,解析时应该把哪些属性作为hash的key来使用, 默认值是['id', 'name', 'key']。

在XML::Simple的中, 所有的选项都有详细说明,而KeyAttr和ForceArray选项被标为important,可见它们是多么常用了。

 

例如:

始终将testcases作为array; 将testcases下的retries作为testcases中的key;

my $ref_hash_result = XMLin($result_xml,

ForceArray => ["testcases"],
KeyAttr => {"testcases" => "retries"},
);

转载于:https://my.oschina.net/lionel45/blog/2120452

你可能感兴趣的文章
[Zabbix问题解决]Zabbix discoverer processes 75% busy
查看>>
DC学院学习笔记(十九):聚类算法(k均值、DBSCAN)
查看>>
CUDA学习(二十八)
查看>>
Java动态代理简述
查看>>
c语言排序算法总结
查看>>
敏捷开发“松结对编程”系列之十二:L型代码结构(质量篇之一)
查看>>
技术的成长
查看>>
Netcat
查看>>
关于AS5 SSH支持key认证的完全解决方案
查看>>
Struts1.2 Hibernate Spring框架组合(三)
查看>>
.net 2.0 BackgroundWorker类详细用法
查看>>
Eclipse快捷键指南(转自蓝法典的专栏)
查看>>
ATI X300 显卡在 Edgy 上使用 aiglx 指南
查看>>
PowerDesigner V15 逆向工程
查看>>
二十年后的回眸(9)——十年著书路
查看>>
windows 2008 R2无法创建性能收集器
查看>>
支持!解决卡巴斯基程序错误及程序断开的问题!
查看>>
如何使用Shodan搜索引擎来诊断漏洞?
查看>>
多了解一下Chrome开发者控制台
查看>>
安全人才严重匮乏催生"情报即服务"产业
查看>>