perl中XML:介面篇

來源:互聯網
上載者:User

 

  • 翻 譯:fayland
  • 出 處:中國 Perl 協會 FPC - PerlChina.org
  • 原 名:Perl XML Quickstart: The Perl XML Interfaces
  • 中 文:中文名稱
  • 作 者:Kip Hampton
  • 原 文:http://www.xml.com/pub/a/2001/04/18/perlxmlqstart1.html
  • 發 表:2001-04-18
  • Perlchina 提醒您:請保護作者的著作權,維護作者勞動的結晶。

目錄

[隱藏]

  • 1 入門簡介
  • 2 任務
  • 3 任務一:提取資料
  • 4 任務二:建立一個XML文檔
  • 5 XML Perl專用介面例子
    • 5.1 XML::Simple

      • 5.1.1 讀
      • 5.1.2 寫
    • 5.2 XML::SimpleObject
      • 5.2.1 讀
      • 5.2.2 寫
    • 5.3 XML::TreeBuilder
      • 5.3.1 讀
      • 5.3.2 寫
    • 5.4 XML::Twig
      • 5.4.1 讀
      • 5.4.2 寫
  • 6 資源

[編輯] 入門簡介

最近在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 concernVicuna (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>    [http://www.eskimo.com/~wallama/funny.htm">Charlie -       biography of a narcissistic llama.]    [http://www.online.discovery.com/news/picture/may99/photo20.html">Bactrian      Camel in front of Great Pyramids in Giza, Egypt.]    [http://www.fotos-online.de/english/m/09/9532.htm">Dromedary      Camel illustrates the importance of accessorizing.]    [http://www.galaonline.org/pics.htm">Many cool alpacas.]    [http://arrow.colorado.edu/travels/other/turkey.html">A visual       metaphor for the perl5-porters list?]    [http://www.thpf.de/suedamerikareise/galerie/vicunas.htm">Wild      Vicunas in a scenic landscape.]  </body></html>

良好縮排的XML結果檔案(如上面所顯示的)對於閱讀很重要,但這種良好的空格處理不是我們案例所要求的。我們所關心的是結果文檔是結構良好的/well-formed和它正確地表現了hash裡的資料。

任務定義完畢,接下來該是代碼例子的時候了。

[編輯] XML Perl專用介面例子

[編輯] XML::Simple

最初建立用來簡化讀寫XML格式設定檔的XML::Simple, 在轉換XML文檔和Perl資料結構之間沒有另外的抽象介面。所有的元素和屬性都可以通過嵌套的引用直接讀取。

[編輯] 讀
use XML::Simple;my $file = 'files/camelids.xml';my $xs1 = XML::Simple->new();my $doc = $xs1->XMLin($file);foreach my $key (keys (%{$doc->{species}})){   print $doc->{species}->{$key}->{'common-name'} . ' (' . $key . ') ';   print $doc->{species}->{$key}->{conservation}->final . "/n";}

[編輯] 寫
use XML::Simple;require "files/camelid_links.pl";my %camelid_links = get_camelid_data();my $xsimple = XML::Simple->new();print $xsimple->XMLout(/%camelid_links,                       noattr => 1,                       xmldecl => '<?xml version="1.0">');

這資料到文檔的任務的條件要求暴露了XML::Simple的一個弱點:它沒有允許我們決定hash裡的哪個key應該作為元素返回和哪個key該作為屬性返回。上面例子的輸出雖然接近我們的輸出要求但還遠遠不夠。對於那些更喜歡將XML文檔內容直接作為Perl資料結構操作,而且需要在輸出方面做更細微控制的案例,XML::Simple和XML::Writer配合得很好。如下例子說明了如何使用XML::Write來符合我們的輸出要求。

use XML::Writer;require "files/camelid_links.pl";my %camelid_links = get_camelid_data();my $writer = XML::Writer->new();$writer->xmlDecl();$writer->startTag('html');$writer->startTag('body');foreach my $item ( keys (%camelid_links) ) {    $writer->startTag('a', 'href' => $camelid_links{$item}->{url});    $writer->characters($camelid_links{$item}->{description});    $writer->endTag('a');}$writer->endTag('body');$writer->endTag('html');$writer->end();

[編輯] XML::SimpleObject

XML::SimpleObject 對XML資料使用回想文件物件模型(Document Object Model)的存取器/accessor來提供一個面對對象介面。

[編輯] 讀
use XML::Parser;use XML::SimpleObject;my $file = 'files/camelids.xml';my $parser = XML::Parser->new(ErrorContext => 2, Style => "Tree");my $xso = XML::SimpleObject->new( $parser->parsefile($file) );foreach my $species ($xso->child('camelids')->children('species')) {    print $species->child('common-name')->{VALUE};    print ' (' . $species->attribute('name') . ') ';    print $species->child('conservation')->attribute('status');    print "/n";}

[編輯] 寫

XML::SimpleObject 沒有通過抓取來建立XML文檔的功能。但是與上面的XML::Simple例子一樣,可以通過與XML::Writer配合簡單的完成任務。

[編輯] XML::TreeBuilder

XML::TreeBuilder 包由兩模組組成:XML::Element用來建立和獲得XML元素點的內容和XML::TreeBuilder作為一個工廠包從已有XML檔案中簡化文檔樹的建立。對於那些已有值得尊敬的 HTML::Element 和 HTML::Tree 模組使用經驗的人來說,使用 XML::TreeBuilder 是非常容易的,因為除了XML特有的方法外其他都是一樣的。

[編輯] 讀
use XML::TreeBuilder;my $file = 'files/camelids.xml';my $tree = XML::TreeBuilder->new();$tree->parse_file($file);foreach my $species ($tree->find_by_tag_name('species')){    print $species->find_by_tag_name('common-name')->as_text;    print ' (' . $species->attr_get_i('name') . ') ';    print $species->find_by_tag_name('conservation')->attr_get_i('status');    print "/n";}

[編輯] 寫
use XML::Element;require "files/camelid_links.pl";my %camelid_links = get_camelid_data();my $root = XML::Element->new('html');my $body = XML::Element->new('body');my $xml_pi = XML::Element->new('~pi', text => 'xml version="1.0"');$root->push_content($body);foreach my $item ( keys (%camelid_links) ) {    my $link = XML::Element->new('a', 'href' => $camelid_links{$item}->{url});    $link->push_content($camelid_links{$item}->{description});    $body->push_content($link);}print $xml_pi->as_XML;print $root->as_XML();

[編輯] XML::Twig

XML::Twig 與其他只有Perl的XML介面不同,它是一個除了標準的XML APIs 外還有其它富有創造性特點的Perlish介面。需要更多更詳細的介紹請查看XML.com 文章

[編輯] 讀
use XML::Twig;my $file = 'files/camelids.xml';my $twig = XML::Twig->new();$twig->parsefile($file);my $root = $twig->root;foreach my $species ($root->children('species')){    print $species->first_child_text('common-name');    print ' (' . $species->att('name') . ') ';    print $species->first_child('conservation')->att('status');    print "/n";}

[編輯] 寫
use XML::Twig;require "files/camelid_links.pl";my %camelid_links = get_camelid_data();my $root = XML::Twig::Elt->new('html');my $body = XML::Twig::Elt->new('body');$body->paste($root);foreach my $item ( keys (%camelid_links) ) {    my $link = XML::Twig::Elt->new('a');    $link->set_att('href', $camelid_links{$item}->{url});    $link->set_text($camelid_links{$item}->{description});    $link->paste('last_child', $body);}print qq|<?xml version="1.0"?>|;$root->print;

這些例子舉例說明了這些普通XML Perl模組的基本使用方法。我的目標是提供足夠多的例子讓你感受怎麼用每個模組寫代碼。下個月我們將關注“實現某一標準XML API的模組”,特別說明的,XML::DOM, XML::XPath 和其他大量的 SAX 和類SAX模組。

[編輯] 資源
  • 下載案例代碼
  • CPAN上XML模組的完整列表
  • Perl-XML郵件組檔案
  • 使用XML::Twig
  • Second Part: Perl XML Quickstart: The Standard XML Interfaces 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.