偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Perl解析XML文件方法指導(dǎo)

開發(fā) 架構(gòu)
本文向大家介紹一下如何利用Perl解析XML文件,當(dāng)在Perl中使用XML時(shí),你會(huì)有將近五百個(gè)CPAN模塊可以選擇,每一個(gè)都支持整合Web服務(wù)的不同方面。

本文和大家重點(diǎn)討論一下如何利用Perl解析XML文件,Perl的核心庫(kù)包括多個(gè)支持XML的模塊。這篇文章就關(guān)注于一個(gè)最早期且涉及最頻繁的核心模塊:XML::Parser.

利用Perl解析XML文件

當(dāng)在Perl中使用XML時(shí),你會(huì)有將近五百個(gè)CPAN模塊可以選擇,每一個(gè)都支持整合Web服務(wù)的不同方面。此外,Perl的核心庫(kù)包括多個(gè)支持XML的模塊。這篇文章就關(guān)注于一個(gè)最早期且涉及最頻繁的核心模塊:XML::Parser.

XML::解析器系列

最初的Perl解析器XML::Parser::Expat由LarryWall在幾年前編寫并由ClarkCooper保持延續(xù)。模塊作為ExpatXMLparser的界面由JamesClark用C語(yǔ)言編寫且已經(jīng)被一些腳本語(yǔ)言所采用。

Expat是一個(gè)以事件為基礎(chǔ)的解析器,意味著特定條件觸發(fā)處理功能。例如,一個(gè)開始或結(jié)尾標(biāo)記將觸發(fā)適當(dāng)?shù)挠脩舳x子程序。XML::Parser模塊在Expat功能的基礎(chǔ)上為普通應(yīng)用所建構(gòu)。

注意Expat在解析之前不會(huì)使XML生效且在遇到錯(cuò)誤出現(xiàn)時(shí)會(huì)失效。這些限制會(huì)使XML::Parser模塊速度非常之快。

XML::Parser簡(jiǎn)介

任何人都可以在Perl中編寫一個(gè)XML解析器。畢竟你只是處理具有已知格式的文本。但由于XML::Parser模塊是用C編寫的,他比任何你可以實(shí)現(xiàn)的純Perl應(yīng)用要更有效的多。而且既然他已經(jīng)被編寫出來(lái),你就可以把時(shí)間花在其他更有用的事情上。

XML::Parser的Expat的功能允許你定義所使用的解析器的樣式。最普遍使用的樣式是Tree和Stream,Tree處理XML的輸入,創(chuàng)建含有文件中的元素和數(shù)據(jù)的成套數(shù)組,這樣你就可以按照你的意愿控制這個(gè)結(jié)構(gòu)。Stream將分析行為劃分層級(jí),在一個(gè)事件的開始做處理,要使用Stream,你必須在你對(duì)模塊做例示并將其與描述事件出現(xiàn)時(shí)如何處理的子程序相關(guān)聯(lián)時(shí)定義處理器。

其它樣式還包括:Sub,允許你特定地對(duì)一種XML標(biāo)記定義其功能。Debug,將文件顯示未標(biāo)準(zhǔn)輸出。Object,與Tree相似但是返回對(duì)象。你也可以通過(guò)在XML::Parser類中定義一個(gè)子類來(lái)設(shè)定一個(gè)客制樣式。#p#

Perl解析XML文件一個(gè)例子

這個(gè)例子中,我將使用XML::Parser類來(lái)創(chuàng)建一個(gè)Stream解析。我將帶出一個(gè)將XML文件解析為標(biāo)準(zhǔn)輸出的簡(jiǎn)單腳本程序,你可以在表A中看到腳本程序(xmlparse.pl),在表B中看到XML文件(data.xml)。這里,由于這是一個(gè)命令行腳本,我選擇不解析URL元素。要執(zhí)行這個(gè)腳本程序,在命令提示下,鍵入:

perlxmlparse.pldata.xml

腳本先參照適當(dāng)?shù)哪K:

useXML::Parser;

接著,從命令提示輸入抓取文件:

  1. my$xmlfile=shift;  
  2. die"Cannotfindfile\"$xmlfile\""  
  3. unless-f$xmlfile; 

腳本設(shè)置一些初始變量:

  1. $count=0;  
  2. $tag=""

然后是創(chuàng)建解析器實(shí)例:

my$parser=newXML::Parser;

現(xiàn)在我們定義事件處理器。我設(shè)置了開始標(biāo)記,結(jié)束標(biāo)記,特性數(shù)據(jù)的處理器。而僅僅因?yàn)槭抢樱疫€加入了一個(gè)缺省處理器,它將對(duì)全部進(jìn)行解析而不被其他事件處理器的定義所明顯覆蓋。如果你計(jì)劃丟棄額外數(shù)據(jù),缺省處理器將自動(dòng)執(zhí)行而不需要定義。

  1. $parser->setHandlers(Start=>\&startElement,  
  2. End=>\&endElement,  
  3. Char=>\&characterData,  
  4. Default=>\&default); 

腳本的主要部分通過(guò)指示解析器實(shí)例而變得緊湊來(lái)通過(guò)XML數(shù)據(jù)文件:

$parser->parsefile($xmlfile);

剩下的就是定義在每個(gè)事件情況下如何進(jìn)行處理。

當(dāng)腳本程序遇到一個(gè)開始標(biāo)記時(shí)將執(zhí)行這個(gè)子程序,這在上面的setHandlers方式中進(jìn)行了定義。我選擇跳過(guò)去并顯示每個(gè)元素中我感興趣的文本。

接下來(lái)我定義的變量自動(dòng)地被XML::Parser模塊所傳遞。對(duì)于開始標(biāo)記處理器,這些變量代表解析器實(shí)例,標(biāo)記名和標(biāo)記可能會(huì)有的屬性數(shù)組。如果標(biāo)記沒有屬性,則一個(gè)空數(shù)組將被傳遞至子程序。

  1. substartElement{  
  2. my($parseinst,$element,%attrs)=@_;  
  3. SWITCH:{  
  4. if($elementeq"article"){  
  5. $count++;  
  6. $tag="article";  
  7. print"Article$count:\n";  
  8. lastSWITCH;  
  9. }  
  10. if($elementeq"title"){  
  11. print"Title:";  
  12. $tag="title";  
  13. lastSWITCH;  
  14. }  
  15. if($elementeq"summary"){  
  16. print"Summary:";  
  17. $tag="summary";  
  18. lastSWITCH;  
  19. }  
  20. }  

在XML數(shù)據(jù)文件中遇到一個(gè)結(jié)束標(biāo)記,endElement子程序就會(huì)被調(diào)用。這里,我要提供一些線中斷。在這里被XML::Parser所傳遞的變量是解析器實(shí)例和標(biāo)記名稱。

  1. subendElement{  
  2. my($parseinst,$element)=@_;  
  3. if($elementeq"article"){  
  4. print"\n\n";  
  5. }elsif($elementeq"title"){  
  6. print"\n";  
  7. }  

由于我們處在命令行,我使用特性數(shù)據(jù)處理器來(lái)去掉可能已經(jīng)包括在XML數(shù)據(jù)文件中的任一行和標(biāo)簽格式并選擇顯示內(nèi)容(如果他來(lái)自一個(gè)標(biāo)題或摘要標(biāo)記)。

  1. subcharacterData{  
  2. my($parseinst,$data)=@_;  
  3. if(($tageq"title")||($tageq"summary")){  
  4. $data=~s/\n|\t//g;  
  5. print"$data";  
  6. }  

最后,我定義了一個(gè)子程序來(lái)處理所有可能遇到的其它類型的元素。其中包括特性編碼定義,文件類型定義和評(píng)注。所有不被開始標(biāo)記,結(jié)束標(biāo)記和特性數(shù)據(jù)事件處理器所明確覆蓋的都包括在這里面。

  1. subdefault{  
  2. my($parseinst,$data)=@_;  
  3. #youcoulddosomethinghere  

小結(jié)

你對(duì)XML::Parser的Expat功能熟悉之后,你可以將其作為接觸幾百個(gè)可用的CPANXML模塊的跳板。我們這里的Stream樣式是唯一一個(gè)可用的XML::Parser模塊中的解析類型。你可能會(huì)發(fā)現(xiàn)其他的會(huì)更適合你的工作任務(wù)。Perl幾乎從第一個(gè)工程方案推出時(shí)就具有XML功能,不論你的需要如何,他都是一個(gè)很好的選擇。

【編輯推薦】

  1. 術(shù)語(yǔ)匯編 Perl閉包概念解析
  2. Perl模式匹配參數(shù)使用詳解
  3. 實(shí)例解析Perl多進(jìn)程技術(shù)的應(yīng)用
  4. 學(xué)習(xí)筆記 Perl split函數(shù)用法指導(dǎo)
  5. Perl多進(jìn)程及其和多線程的關(guān)系解析


 

責(zé)任編輯:佚名 來(lái)源: portal.vsharing.com
相關(guān)推薦

2010-07-26 15:17:51

Perl解析XML文件

2010-07-23 14:12:14

Perl Hash

2010-07-21 11:17:30

2010-07-26 13:27:19

Perl多線程

2010-07-26 14:45:17

Perl Hash

2010-07-13 13:15:17

Perl

2010-07-15 09:10:08

Perl函數(shù)手冊(cè)

2010-07-16 09:06:57

Perl文件

2010-07-21 13:43:30

Perl數(shù)組

2010-07-20 13:02:08

Perl數(shù)組

2010-07-20 10:02:15

Perl類

2010-07-16 17:04:38

Perl方法

2010-07-26 10:09:01

Perl split函

2010-07-14 17:20:33

讀寫Perl文件

2010-07-21 10:32:05

Perl函數(shù)返回值

2010-07-26 16:23:23

Perl語(yǔ)言

2010-07-26 09:32:41

Perl命令行

2010-07-20 14:41:55

Perl語(yǔ)法

2022-03-22 09:41:31

Java編程語(yǔ)言持久化

2009-02-17 11:23:08

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)