[Perl]用XML::Simple解析XML文件
来源:互联网 发布:西门子编程电缆那种好 编辑:程序博客网 时间:2024/05/17 02:56
版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2008/09/03/perl-xml-simple/以及本声明。
在Perl中解析XML的方法最常见的就是使用 XML::DOM 和 XML::Simple了。 XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。对于小型且不复杂的XML文件,XML::DOM真是杀鸡用牛刀。这时就轮到轻便的XML::Simple上场了。
XML::Simple如其名,真的很简单。假设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解析成一个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,可见它们是多么常用了。
在Perl中解析XML的方法最常见的就是使用 XML::DOM 和 XML::Simple了。 XML::DOM过于庞大,而且解析结果是一个DOM树,操作也不方便。对于小型且不复杂的XML文件,XML::DOM真是杀鸡用牛刀。这时就轮到轻便的XML::Simple上场了。
XML::Simple如其名,真的很简单。假设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解析成一个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,可见它们是多么常用了。
- [Perl]用XML::Simple解析XML文件
- [Perl]用XML::Simple解析XML文件
- 用perl XML::Simple解析XML文件
- 用perl XML::Simple解析XML文件
- 使用 Perl 的 XML::Simple 解析 XML 文档
- Perl XML::Simple 详解
- simple XML解析XML
- Simple XML解析XML
- Perl XML::Simple parse simple xml file
- perl使用xml::simple来读写xml
- perl使用xml::simple来读写xml
- Perl编程之基于XML::XPath和XML::Simple的XML文件读写浅析
- perl XML解析
- perl批处理xml文件
- XML::Parser module installlibxml-simple-perl
- [Perl] 读取XML值 -- XML::Simple/Data::Dumper
- Perl解析XML文件时的字符集编码问题
- perl 解析xml ,json文件及curl工具的使用
- 系统监控:msn在线机器人实时报警
- 用squid实现cdn网络加速(ZT)
- JScript中使用数组
- LVS集群中的IP负载均衡技术
- [Perl]管道、进程及其他
- [Perl]用XML::Simple解析XML文件
- LVS算法介绍[基础知识]
- LVS集群的负载调度
- 用myeclipse中遇到tomcat jdk name错误处理的办法
- 使用Varnish代替Squid做网站缓存加速器的详细解决方案
- Linux操作系统下的串口通信学习笔
- Javascript 如何实现对象的拖动?
- [Perl]杂谈
- 《人月神话》读书笔记(十一)——项目经理的基本职责和主要日常工作