用perl XML::Simple解析XML文件

网友投稿 328 2022-08-29

用perl XML::Simple解析XML文件

在Perl中解析XML的方法最常见的就是使用 ​​XML::DOM​​ 和 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,可见它们是多么常用了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Linux 守护进程的编程方法
下一篇:从“流量”到“留心”,百度汽车营销再拓内容价值边界!(汽车企业是如何利用百度大数据进行精准营销的)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~