首页 >  应用与开发  >  Perl

快速开始Perl XML

发布日期:2010-06-18 

入门简介
最近在Perl-XML邮件组经常问起的问题是如何给不熟悉的用户一个对大量 Perl XML 模块的快速指引性概述文档。在接下来的几个月里我将单独对此问题写几篇专栏文章。
CPAN上的XML模块可以分成三大类:对 XML 数据提供独特的接口(通常有关在XML实例和Perl数据之间的转换),实现某一标准XML API的模块,和对一些特定的XML相关任务进行简化的特殊用途模块。这个月我们先关注第一个,XML Perl专用接口。  

use Disclaimer qw(:standard);
此文档不是为了对模块性能进行基准测试,我的目的也不是暗示某一模块比另一个模块更有用。为你的项目选择正确的 XML 模块更多依赖于项目本身和你积累的经验。不同的接口适应于不同的任务和不同的人。我的唯一目的是通过定义两个简单的任务,然后提供不同借口的可运行例子来显示如何获得同样的最终结果。
任务
虽然XML的用途非常多,但大部分XML相关任务可分成两组:一是从已有的XML文档提取数据,另一个是使用其他资源的数据创建一个新的XML文档。既然如此,我们所用来介绍不同模块的例子将由“从一个XML文件中提取某一特定数据集”和“将一Perl数据结构转为某一特定XML格式”组成。
任务一:提取数据
首先,假设有如下XML片断:
<?xml version="1.0"?>
<camelids>
  <species name="Camelus dromedarius">
    <common-name>Dromedary, or Arabian Camel</common-name>
    <physical-characteristics>
      <mass>300 to 690 kg.</mass>
      <appearance>
        The dromedary camel is characterized by a long-curved
        neck, deep-narrow chest, and a single hump.
        ...
      </appearance>
    </physical-characteristics>
    <natural-history>
       <food-habits>
         The dromedary camel is an herbivore.
         ...
       </food-habits>
       <reproduction>
         The dromedary camel has a lifespan of about 40-50 years
         ...
       </reproduction>
       <behavior>
         With the exception of rutting males, dromedaries show
         very little aggressive behavior.
         ...
       </behavior>
       <habitat>
         The camels prefer desert conditions characterized by a
         long dry season and a short rainy season.
         ...
       </habitat>
    </natural-history>
    <conservation status="no special status">
      <detail>
        Since the dromedary camel is domesticated, the camel has
        no special status in conservation.
      </detail>
    </conservation>
  </species>
  ...
</camelids>
现在我们假设此完整文档(可从本月例子代码中获取)包含骆驼家族所有成员的全部信息,而不仅仅是上面的单峰骆驼信息。为了举例说明每一模块是如何从此文件中提取某一数据子集,我们将写一个很简短的脚本来处理camelids.xml文档和在STDOUT上输出我们找到的每一种类的普通名(common-name),拉丁名(用括号包起来),和当前保存状况。因此,处理完整个文档,每一个脚本的输出应该为如下结果: Bactrian Camel (Camelus bactrianus) endangered
Dromedary, or Arabian Camel (Camelus dromedarius) no special status
Llama (Lama glama) no special status
Guanaco (Lama guanicoe) special concern
Vicuna (Vicugna vicugna) endangered
任务二:创建一个XML文档
为了示范每一模块是如何从其他数据源中创建新的XML文档,我们将写一个小脚本将一个简单的Perl hash转换为一个简单的XHTML文档。hash里包含一些指向很cool的特定相关骆驼的网页的URLs。
Hash 如下:

my %camelid_links = (
    one   =">" { url         =">" '
    http://www.online.discovery.com/news/picture/may99/photo20.html',
               description =">" 'Bactrian Camel in front of Great ' .
                              'Pyramids in Giza, Egypt.'},
    two   =">" { url         =">" 'http://www.fotos-online.de/english/m/09/9532.htm',
               description =">" 'Dromedary Camel illustrates the ' .
                              'importance of accessorizing.'},
    three =">" { url         =">" 'http://www.eskimo.com/~wallama/funny.htm',
               description =">" 'Charlie - biography of a narcissistic llama.'},
    four  =">" { url         =">" 'http://arrow.colorado.edu/travels/other/turkey.html',
               description =">" 'A visual metaphor for the perl5-porters ' .
                              'list?'},
    five  =">" { url         =">" 'http://www.galaonline.org/pics.htm',
               description =">" 'Many cool alpacas.'},
    six   =">" { url         =">" 'http://www.thpf.de/suedamerikareise/galerie/vicunas.htm',
               description =">" 'Wild Vicunas in a scenic landscape.'}
);
 
而我们所期望从hash中创建的文档例子为:
<?xml version="1.0">
<html>
  <body>
    <a href="Charlie'>http://www.eskimo.com/~wallama/funny.htm">Charlie -
      biography of a narcissistic llama.</a>
    <a href="Bactrian'>http://www.online.discovery.com/news/picture/may99/photo20.html">Bactrian
      Camel in front of Great Pyramids in Giza, Egypt.</a>
    <a href="Dromedary'>http://www.fotos-online.de/english/m/09/9532.htm">Dromedary
      Camel illustrates the im