將Web頁面轉換成XML資料來源

來源:互聯網
上載者:User
web|xml|資料|資料來源|頁面|轉換 本文將為你提供了一個強大而靈活的方法,旨在從現有的HTML檔案中提取並組合成有意義的資料。

HTML和Web已經永遠地改變了人們通訊與溝通的方式,HTML對人們來說很方便,它使得資訊更易於查看和航行,但遺憾的是,它對電腦之間的交流就遠遠沒有那麼方便了:Web頁面上由於層的實現代碼,使得電腦系統都難以找到和使用資料。這時,XML應運而生,它承諾要對電腦系統之間通訊的方式起到同樣的作用,XML將成為資訊在不同電腦系統之間流動的公用語言。應用本文中介紹的簡單編程技術,你可以將任何HTML頁面轉換成一個XML資料來源。

常式說明
想象有一個花店,每個星期都要根據價格從3個鮮花批發商中的一個進貨。每個星期,店主都要查看每個批發商的Web網站來找到最低的價格。店主想把這三個批發商的價格資訊都組合到一個Web頁面中來簡化他搜尋的過程。

下面就示範如何從3個Web頁面中提取資訊並且將它們結合到一個單一的XML文檔中。我們為這個例子建立了3個鮮花批發商的頁面:

<>
<>
<>

出於示範目的,每次訪問頁面時,每個頁面上的價格都會改變。另外,由於Web頁面經常會把相關資料放在HTML表格中,樣本頁面和應用程式將著重從表格中而不是從其它標記中恢複資訊。

解決方案
下表包含了一個含有你需要的資料的樣本XML檔案Flowers.xml:

<Flowers><Flower><Vendor>FakeFlowers</Vendor><Name>Daffodil</Name>
<Price>$2.00</Price></Flower>
<Flower><Vendor>FictitiousFlowers</Vendor><Name>Daffodil</Name><Price>$5.00</Price>
</Flower>
<Flower><Vendor>PretendFlowers</Vendor>
<Name>Daffodil</Name><Price>$3.50</Price></Flower>
</Flowers>


現在你需要編寫代碼,直接從相應的批發商Web網站中提取鮮花的名稱和價格。一個解決方案是在XML文檔中放置特殊的標記,以後用網站中的值來代替。這種方法與XSL相同。要想這樣做,你可以定義一個新的元語言,它可讓你向XML中增加可替換的標記。
這個新的元語言需要完成以下任務:

識別文檔,以便知道它是在使用這個語言
提供一個方法,以指定包含著你想恢複資料的Web頁面
指定如何從每個頁面恢複特定的資料元素。下面的例子提取前一個XML檔案,並且包含了新的元語言標記來完成上面所列舉的3個目標:
<WG:Documentxmlns:WG="">
<Flowers>
<WG:Templateurl="">
<Flower>
<Vendor>FakeFlowers</Vendor>
<Name><WG:GetTableElementpos="1"row="8"col="1"/></Name>
<Price><WG:GetTableElementpos="1"row="8"col="4"/></Price>
</Flower>
</WG:Template>
<WG:Templateurl="">
<Flower>
<Vendor>FictitiousFlowers</Vendor>
<Name><WG:GetTableElementpos="1"row="6"col="2"/></Name>
<Price><WG:GetTableElementpos="1"row="6"col="3"/></Price>
</Flower>
</WG:Template>
<WG:Templateurl="">
<Flower>
<Vendor>PretendFlowers</Vendor>
<Name><WG:GetTableElementpos="1"row="3"col="1"/></Name>
<Price><WG:GetTableElementpos="1"row="3"col="4"/></Price>
</Flower>
</WG:Template>
</Flowers>
</WG:Document>

第二個XML例子有一個包裹元素叫做Document,放置在原始XML的兩頭。Document元素為這個叫做WebGather的新元語言定義了名稱空間。WebGatherSchema.xml檔案中定義了WebGather語言元素:

<!—WebGatherschema-->
<Schemaxmlns="urn:schemas-microsoft-com:xml-data">
<elementtype='Document'>
<elementtype='Template'>
<attributetype='url'/>
<elementtype='GetTableElement'>
<attributetype='pos'/>
<attributetype='row'/>
<attributetype='col'/>
</element>
</element>
</element>
</Schema>

WebGatherschema允許使用三種類型的XML元素:Template(模板)元素只有一個屬性"URL",它定義了包含資料的源Web頁面。GetTableElement標記是一個在Template元素中定義的頁面內表格中一個單元的內容預留位置。GetTableElement標記有三個屬性,第一個屬性叫做"pos",它定義了HTMLWeb頁面中表格元素的索引號,其中第一個表格就是1;"row"和"col"屬性定義了包含資料的表格中的單元。

具體實現
元語言需要執行才能起作用。我使用了一個VisualBasicDLL工程檔案,其中只包含了一個類叫做MetaGather。這個類使用了一個公用方法,叫做Transform,它接收一個XML字串,其中包含WebGather標記,它取代帶有來自指定Web頁面值的那些標記,產生XML字串。這個類使用了MicrosoftInternetExplorer控制項來恢複Web頁面,並從XML字串參數中的Template標記中讀取包含資料的頁面URL。

PrivateFunctionLoadPage_
(ByValstrURLAsString)AsBoolean
'Initializethedownloadcompleteflag
m_bDownloadComplete=False

'Loadthepagetomakesureits
'notthecachedversion
m_IE.NavigatestrURL,4

'Waituntildocumentfinishesloading
Whilem_IE.ReadyState<>READYSTATE_COMPLETE
DoEvents
Wend

'Checkifyouendedupontheerrorpage
Ifm_IE.Document.Title=_
"Thepagecannotbefound"Or_
m_IE.Document.Title="Nopagetodisplay"_
Then
LoadPage=False
Else
LoadPage=True
EndIf
EndFunction

LoadPage函數調用MicrosoftInternet控制項的Navigate方法從Internet中取回頁面內容。Navigate工作方式是不同步的,因此在繼續之前必須要等待頁面裝載。這可以通過使用一個迴圈以等待一個模組層級別的標誌設定完成來實現。DownloadComplete事件被啟用時,這個標誌就被設定。通常Navigate方法被調用時,DownloadComplete事件就被啟用。這樣一來,即使是導航失敗,也能保證這個標誌最終會被設定為真,然後我們就退出迴圈。

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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