`
zccst
  • 浏览: 3322895 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

perl脚本——解析xml

    博客分类:
  • perl
 
阅读更多
在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


分享到:
评论

相关推荐

    mysql cookbook和Perl脚本书籍

    在网络编程方面,《Perl by Example》教会读者如何处理HTTP请求,解析XML和HTML文档,使得Perl的网络应用能力得到充分展现。此外,书中还注重于错误处理和调试技巧的介绍,强调编写可维护代码的重要性。这些内容对于...

    perl 模块(spreadsheet、XML::Simple、DBB::mysql等模块)

    在标题和描述中提到的几个模块——Spreadsheet、XML::Simple以及DBD::mysql,分别对应了处理电子表格、解析XML文档以及与MySQL数据库交互的功能。 1. Spreadsheet模块:这个模块主要用于读取和写入电子表格文件。在...

    perl技术内幕,perl黑皮书

    第15章 Perl/TK——窗口、按钮及其他 第16章 数据结构和数据库 第17章 创建包和模块 第18章 创建类和对象 第19章 面向对象编程 第20章 INTERNET和套接字编程 第21章 CGI编程:GGI.PM 第22章 CGI:创建WEB...

    perl技术内幕(英文版)+源代码

    第15章 Perl/TK——窗口、按钮及其他 第16章 数据结构和数据库 第17章 创建包和模块 第18章 创建类和对象 第19章 面向对象编程 第20章 INTERNET和套接字编程 第21章 CGI编程:GGI.PM 第22章 CGI:创建WEB计数器、来宾...

    Perl编程语言

    Perl社区活跃,有许多开源库和模块可供开发者使用,如CPAN(Comprehensive Perl Archive Network)——一个包含数万种模块的资源库,涵盖了网络、数据库、图形处理、XML解析等多个领域。这使得Perl在实际项目中具有...

    PERL编程24学时教程

    安装完成后,学习设置环境变量以确保Perl脚本能正常运行。 2. **Perl语法基础** - 学习Perl的语句结构,包括注释、变量声明、赋值操作、输入/输出语句。了解Perl中的数据类型,如标量、数组、哈希以及引用。 3. **...

    pirateget:Piratebay 备份脚本

    PB 存档脚本这是位于 Pirate Bay 档案的 Karel Bílek 脚本的最新分支前段时间,我做了一个实验,在保留重要信息的同时,我可以把 ... 对此我很抱歉,但 Karel 制作了可以修复它们的 perl 脚本,请参阅 。 该脚本需要

    Snapper Development System-开源

    Perl 是一种功能强大的脚本语言,适合处理文本、数据解析以及各种系统任务。在 Snapper 中,Perl 脚本被嵌入到 XML 文件中,形成一个自包含的执行环境。这样,应用程序的所有组成部分——界面和逻辑——都被封装在一...

    Bugzilla-Guide.pdf

    - **Perl**:Bugzilla依赖于Perl脚本语言,因此首先需要确保系统上已安装了合适的Perl版本。 - **数据库引擎**:Bugzilla支持多种数据库引擎,如MySQL和PostgreSQL等。 - **MySQL**:一种流行的开源关系型数据库...

    专业的文本代码比较器

    它支持对比各种类型的文件,包括但不限于Java、HTML、C、C++、Perl脚本、SQL、XML等常见的编程语言和数据格式。此外,Beyond Compare 4还提供了丰富的自定义设置,允许用户根据个人习惯和项目需求调整对比规则,如行...

    duckduckgo-publisher:DuckDuckGo及其微型站点的静态文件的生成

    然后,Perl脚本解析这些源文件,根据预定义的规则进行必要的替换和处理,如动态插入搜索结果、填充元数据等。接着,生成的静态HTML文件将被组织成适合部署的结构,准备上传至服务器。 在处理微型站点时,“duckduck...

    PHP实例开发源码—Mibew Web Messenger 开源在线客服系统 PHP版中文版.zip

    虽然现代实现中XML已不再必需,但AJAX的核心思想——异步通信,仍被广泛用于创建响应式Web应用。 **5. 安装与部署** 在使用Mibew前,你需要配置服务器环境,包括PHP解析器、MySQL数据库和适当的权限设置。安装过程...

    [完整][中文][WEB安全测试].(美)霍普.扫描版.pdf

    8.1 编写简单的Perl脚本来获取页面 167 8.2 以编程方式更改参数 169 8.3 使用POST模仿表单输入 170 8.4 捕获和保存Cookie 172 8.5 检查会话过期 173 8.6 测试会话固定 175 8.7 发送恶意Cookie值 177 8.8 上传恶意...

    跨教程

    从数据库接口到网络编程,从XML解析到图形用户界面,几乎你能想到的编程需求,CPAN都有相应的解决方案。 安装和使用CPAN模块,我们需要依赖一个工具——CPAN客户端。在大多数Unix/Linux系统中,Perl通常已经预装了...

    PHP5操作手册

    7. XML处理:PHP5加强了XML处理能力,提供了SimpleXML、DOM、XMLReader和XMLWriter等库,方便解析和生成XML文档。 8. 正则表达式:PHP5使用了PCRE(Perl Compatible Regular Expressions)库,提供更强大的正则...

    JDeveloper IDE External Filter Add-in-开源

    1. **文本转换**:开发者可以通过编写Ruby或Perl脚本来实现复杂的文本替换、格式化或者分析,然后在IDE内部直接应用这些脚本。 2. **代码美化**:可以使用外部工具对代码进行格式化,使其更符合编码规范。 3. **代码...

    Config-Augeas-MM

    Augeas是一种配置文件解析和修改的工具,它支持多种配置文件格式,如Linux系统中的 Ini-like、XML、Shell脚本等。这个Perl模块使得在Perl程序中操作和管理这些配置文件变得更加方便。 Config-Augeas-MM模块的核心...

    PHP源码PHP论文格式化系统-前台的设计与实现(源代码+论文)

    - 使用DOM解析器等工具来实现文本的解析与格式调整。 ##### 3. 结果展示与下载 - 将格式化后的文档内容呈现给用户预览。 - 提供下载链接,允许用户下载最终的格式化文档。 #### 五、总结 通过上述分析与设计,我们...

    网络爬虫-Python和数据分析.pdf

    相比之下,脚本语言如Perl、Python、Java和Ruby更受青睐,特别是对于需要处理大量文本和网页内容的场景。其中,Python由于其简洁的语法、丰富的库支持、跨平台性以及在科学计算、数据分析、可视化等方面的优势,成为...

Global site tag (gtag.js) - Google Analytics