日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Perl解析XML文件方法指導

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

利用Perl解析XML文件

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

XML::解析器系列

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

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

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

XML::Parser簡介

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

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

其它樣式還包括:Sub,允許你特定地對一種XML標記定義其功能。Debug,將文件顯示未標準輸出。Object,與Tree相似但是返回對象。你也可以通過在XML::Parser類中定義一個子類來設定一個客制樣式。#p#

Perl解析XML文件一個例子

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

perlxmlparse.pldata.xml

腳本先參照適當?shù)哪K:

useXML::Parser;

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

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

腳本設置一些初始變量:

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

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

my$parser=newXML::Parser;

現(xiàn)在我們定義事件處理器。我設置了開始標記,結(jié)束標記,特性數(shù)據(jù)的處理器。而僅僅因為是例子,我還加入了一個缺省處理器,它將對全部進行解析而不被其他事件處理器的定義所明顯覆蓋。如果你計劃丟棄額外數(shù)據(jù),缺省處理器將自動執(zhí)行而不需要定義。

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

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

$parser->parsefile($xmlfile);

剩下的就是定義在每個事件情況下如何進行處理。

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

接下來我定義的變量自動地被XML::Parser模塊所傳遞。對于開始標記處理器,這些變量代表解析器實例,標記名和標記可能會有的屬性數(shù)組。如果標記沒有屬性,則一個空數(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. }
  21. }

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

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

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

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

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

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

小結(jié)

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


文章題目:Perl解析XML文件方法指導
網(wǎng)址分享:http://www.dlmjj.cn/article/dhipchs.html