在Perl中解析XML的方法最常见的就是使用 XML::DOM 和 XML::Simple了。 XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。对于小型且不复杂的XML文件,XML::DOM真是杀鸡用牛刀。这时就轮到轻便的XML::Simple上场了。
一、使用XML::Simple
XML::Simple如其名,真的很简单。假设XML(sample.xml)内容如下:
<opt>
<user login="grep" fullname="Gary R Epstein" />
<user login="stty" fullname="Simon T Tyson" >
<session pid="12345"/>
</user>
<text>This is a test.</text>
</opt>
那么只需这样写:
use XML::Simple;
use Data::Dumper;
$xml = XMLin('sample.xml');
print Dumper($xml);
使用XML::Simple 本身相当简单。XML::Simple 类的每个对象暴露两个方法:XMLin() 和 XMLout()。XMLin() 方法读取一个 XML 文件或字符串,然后将其转换成一个 Perl 表示;XMLout() 方法则正好相反,读取一个 Perl 结构并将其作为一个 XML 文档实例返回。上面的脚本使用XMLin() 方法读取前面创建的“sample.xml”然后将处理结果存储在 $xml 中。然后,$xml 的内容使用Perl 的 Data::Dumper 显示出来。
就可以轻而易举地将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,注意与上面的结果的区别:
<opt>
<user id="grep" fullname="Gary R Epstein" />
<user id="stty" fullname="Simon T Tyson">
<session pid="12345"/>
</user>
<text>This is a test.</text>
</opt>
$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,可见它们是多么常用了。
二、使用XML::DOM
分享到:
相关推荐
perl脚本perl脚本perl脚本perl脚本
oracle数据库同步perl脚本示例 其中有2个文件,一个是 perl同步脚本,另一个是存储过程; 大致思路是:perl脚本从数据库A同步数据至库B的临时表中,再通过存储过程将库B中的临时数据过滤导入正式数据当中。
perl脚本自动生成UVM验证框架
perl脚本了解及学习,学会简单的perl脚本
适合初学perl教程 适合初学perl教程 适合初学perl教程
在Java中运行Perl脚本 JERL
perl脚本学习范例
讲述的是linux下的perl脚本的详细情况。
用perl语言编程,按照xml文件格式生成xml文件。-Using perl programming language, according to generate xml file xml file forma
linux加密perl 脚本工具
适合Linux学习,Perl脚本开发基础学习,相信对你有帮助
ActivePerl一个perl脚本解释器。其包含了包括有 Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套开发工具程序,可以让用户编写出适用于unix,windows,linux系统的CGI程序来。
推荐一篇好文章:关于利用perl 脚本产生状态机的verilog代码和DC 脚本的
编写的shell 脚本、perl 脚本、python 脚本 等如果不想被别人看到原文件,可以使用该工具shc ,对脚本文件加密,
perl脚本大全
好用就完了
适用于materials studio,用于计算两体系/层与层/单分子与总体系的相互作用能,计算轨迹文件中每一帧的相互作用能。
NULL 博文链接:https://fruitking.iteye.com/blog/799757
设置网卡别名perl脚本,设置网卡别名perl脚本,设置网卡别名perl脚本。
用Perl/Tkx写的genesis2000板边脚本