设为首页 收藏本站
查看: 1055|回复: 0

[经验分享] perl脚本——解析xml

[复制链接]

尚未签到

发表于 2017-5-18 07:25:15 | 显示全部楼层 |阅读模式
在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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378559-1-1.html 上篇帖子: perl读写二进制文件 下篇帖子: perl实现异常时报警
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表