摘要:簡要介紹了XML入門知識,在Flash中使用XML的優、缺點。從使用XML對象和使用XMLSocket對象兩種方式討論了在Flash 8中載入XML文件的方法,并分析了在Flash 8中使用兩種方式載入XML文件的通信原理,通過簡要代碼說明Flash與XML之間的通信方法。淺要介紹了XML在Flash中涉及到的本地和網絡兩方面的應用。
關鍵詞:XML;XML對象;XMLSocket對象;Flash 8
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)15-20992-04
The Brief Introduction to the Communication between Flash and XML
SUN Ying
(Zhengzhou Railway Vocational Technical College,Zhengzhou 450000,China)
Abstract:This article introduces the rudimental knowledge of XML and the merits when used in Flash.It discusses the method of loading XML files and analyzes its communicating principle in Flash 8 by using XML object and using XML Socket object.At the same time,it describes the communicating method through brief code.In a word,the article introduces the native and network application of XML in Flash.
Key words:XML;XML object;XML Socket object;Flash 8
1 有關XML
1.1 XML入門知識
XML(eXtensible Markup Language)是一種具有數據描述功能(Meta-language)、高度結構性及可驗證性的語言。和HTML一樣,XML同樣使用了標記和屬性;和HTML最大的不同在于XML的標記和屬性允許用戶自行定義,并可以依照所定義的標記與屬性的語法來開發應用程序。XML采用了開放架構設計,它允許在Internet上的任何平臺或語言之間交換數據。這項技術已經被廣泛采用,目前幾乎難以找到一個不以某種方式使用XML的應用程序。
一個簡單的XML文件如下所示:
1.2 為什么在Flash中用XML
首先,大多數瀏覽器限制了URL為256個字符(包括查詢字符串數據)。而XML對象沒有這樣的限制,這就使它成為將數據庫內容加入Flash動畫的一個理想方法。其次,XML對象允許輸入和集成任何Web上的XML格式的數據到Flash中,Flash能夠將XML數據和精彩的動畫及聲音無縫結合起來。另外,Flash幾乎擁有在任何平臺上處理XML的能力。一般來說,大多數XML轉換是在服務器端處理的,因為瀏覽器對XML的支持不是很完全。但是,Flash載入一個外部XML文件如果超過15秒就會超時,它不會再進行載入,Flash Player和動畫會停止。同樣的,在瀏覽器中使用load或sendAndLoad載入64K或更大的數據會導致性能問題。其特征包括服務器應答\"Error 501-Not Implemented\"或瀏覽器的無響應狀態。Flash Player也不能從外部Web站點上載入XML文件。Flash動畫只能從它自
己的域里載入XML數據。例如,一個在adomain.com上的Flash動畫就不能從bdomain.com讀取或載入XML數據。
2 Flash中XML應用的原理
Flash幾乎擁有在任何平臺上處理XML的能力。XML對象允許輸入和集成任何WEB上的XML格式的數據到Flash中,Flash能夠將XML數據和精彩的動畫及聲音無縫結合起來。現在用Flash 8來做有關XML的應用很方便。在Flash 8中載入XML文件主要有兩種方式:使用XML對象和使用XMLSocket對象。使用XML對象應用的HTTP的通信方式,而使用XMLSocket對象應用的是Socket的通信方式,兩者有較大的區別。
2.1 使用XML對象
在網絡應用中,使用XML對象應用HTTP通信方式,基本的通信模式仍然是請求響應。首先在Flash中對數據進行處理,生成XML樹,然后通過HTTP的通信方式將XML文件發送到服務器端。在服務器端,首先對接收到的XML樹進行解釋,再根據流程做相應的操作,比如讀寫數據庫或其他資源,然后生成XML樹,通過HTTP的通信方式將XML文件發送到Flash端。最后在Flash端接收XML文件,對XML樹進行解釋,對相應的數據進行操作,如此循環。其通信原理如圖1所示。

Flash端主要用到XML對象中的send( )、load( )、sendAndLoad( )、onLoad( )、onData( )及其他操縱XML樹的方法與事件。比如,生成XML樹的代碼如下:
loginXML=new XML( ); //生成一個XML對象
loginElement=loginXML.createElement(“LOGIN”); //生成一個元素
loginElement.attributes.username=username;
loginElement.attributes.password=password; //設置元素的屬性
loginXML.appendChild(loginElement); //將所生成的元素加到XML對象
解釋XML樹的代碼如下:
loginReplyXML=new XML( ); //生成一個響應的XML對象
loginReplyXML.onLoad=onLoginReply( );//設置響應XML對象下載事件的函數
function onLoginReply( ) { //對返回的XML文件進行操作
var e=this.firstChild; //解釋返回的XML文件
if(e.nodeName==”LOGINREPLY” e.attributes.status==”OK”) {
//根據返回的XML文件中的數據做相應的操作
gotoAndStop(“success”);
} else {
gotoAndStop(“loginFailed”);
}}
有關XML數據的通信代碼如下:
loginXML.sendAndLoad(“http://www.cytang.com/test.asp”, loginReplyXML);
//根據URL去取響應的XML文件到響應的XML對象中
在服務器端常用的工具有ASP、JSP、PHP、Perl等腳本語言,它們所起的作用是操作XML樹和數據的通信。
下面以常用的ASP為例,解釋XML樹的代碼:
var XMLLogin=new ActiveXObject(“MsXML2.DomDocument”);
//創建一個新的Domdocument對象,保存客戶端傳送過來的XML請求
XMLLogin.loadXML(Request.Form( ));
//從發送來的表單中取得數據
var reElement=XMLLogin.documentElement;
//創建XML元素
password=reElement.attributes[0].nodeValue;
username=reElement.attributes[1].nodeValue;
//提取用戶名和密碼信息
生成XML樹的代碼并發送的代碼為:
var XMLRepley=new ActiveXObject(“MsXML2.DomDocument”);
//創建一個新的DomDocument對象,向客戶發送
XMLRepley.loadXML(“
//創建一個簡單的XML文件
Response.Write(XMLRepley.XML);
//也是通過Write( )方法將XML文件返回到Flash端
另外一種情況是載入本地XML文件,也就是生成、解釋XML文件,獲取所需數據,不需要在服務器端做其他的操作。例如,讀一個本地XML文件的代碼為:
playlist_XML=new XML( ); //創建一個XML對象
playlist_XML.ignoreWhite=true;//省略空白
playlist_XML.onLoad=function(success){//當加載XML文件成功的時候觸發此函數
trace(“success”);}
Playlist_XML.load(“cytang.XML”); //加載本地的XML文件
上面所涉及的代碼都是舉例而已,實際應用中的代碼會更復雜。但其中的原理都是相通的,其流程就是先生成XML文件,發送到服務器端,然后將服務器端返回的XML文件解釋。
2.2 使用XMLSocket對象
在網絡通信中,使用XMLSocket對象的通信方式為Socket。所謂的Socket,可以將它想象為一條通路,需要通信的時候,在客戶端服務器端建立一個鏈接,然后傳送內容,通信完畢后再撤銷這個通路。Flash端跟服務器端的通信模式為:首先在Flash端與服務器建立一個Socket鏈接,生成XML文件后,通過所建立的Socket鏈接將XML文件發送到服務器端,服務器端解釋所接收到的文件,對數據進行相應的操作后,生成一個XML文件,通過Socket鏈接發送到Flash端,Flash端解釋XML文件后就得到所需要的數據。如此循環,操作完成后關閉Socket鏈接,其通信原理如圖2所示。

在Flash端:XMLSocket對象中,只有三個方法和四種事件,都是在Socket通信時候用的。下面是XMLSocket的三個方法:
.connect(服務器地址,端口號):嘗試鏈接遠程計算機,示例如下:
var mySocket=new XMLSocket( ); //聲明XMLSocket對象
mySocket.connect(“192.168.0.126”,9980); //根據IP地址和端口鏈接服務器
mySocket.onConnect=function(success) { //鏈接成功與否的判斷
if(success) {
trace(“鏈接成功”);
} else {
trace(“鏈接失敗”);
}
}
mySocket.onXML=function(XMLDoc) { //當接收到XML文檔的時候,觸發此函數
}
其中,connect方法有兩個參數,第一個參數表示要鏈接的主機,可以是全限定的域名或者IP地址,需要注意一點:當使用IP地址,如192。168。0。126時,需把它當作字符串來處理,即要用引號把IP地址括起來。如果為1,則鏈接Web服務器(從該Web服務器下載了包含當前Flash應用的網頁)所在的IP地址。
第二個參數表示要鏈接的端口,由于低于1024的端口被通用程序所占,Flash的安全規則不允許在低于1024的端口建立鏈接。Connect方法返回布爾型變量true或1,表示鏈接是否成功。以上語句中,如果鏈接失敗,connect方法返回1,則會彈出“鏈接失敗”的信息框。
.send(信息內容):在和遠程計算機建立鏈接后,發送信息到遠程計算機,示例如下:
mySocket.send(“
其中,參數可以是一個XML字符串,也可以是一個XML對象,如果是XML對象,send方法會先將對象轉化為字符串,然后將該字符串發送到服務端,并在字符串發送后,追加發送一個0字節。Send方法沒有返回值。
.close( ):關閉和遠程計算機之間的鏈接,示例如下:
mySocket.close( );
下面是XMLSocket的四種事件:
.onConnect(聯機結果)
當connect( ) 聯機方法執行完畢后,它會觸發并且傳入一個代表聯機是否成功的參數給onConnect( )事件,如果聯機成功,其值將是true。
.onData( )
當XMLSocket接收到遠程計算機傳入的數據時,就會觸發onData( )事件。
.onXML( )
當XMLSocket接收到遠程計算機傳入的XML數據時,就會觸發onXML( )事件。在onXML事件中,使用onData事件中得到的數據生成一個XML對象,并把該對象作為參數傳給onXML事件的處理函數,所以如果要自定義onXML事件的處理函數,服務器端發送來的數據就必須是XML格式,否則就會發生意想不到的錯誤。如果設置了onData事件的處理函數,當數據到達時,將不再調用onXML事件的處理函數,除非再顯式地調用,所以在某種意義上,這兩種事件是互斥的。
.onClose( )
當遠程端計算機中斷鏈接時,這個事件會被觸發。
在服務器端:選用服務器端的開發語言的標準是,起碼要能夠做Socket方面的操作(復雜的應用當中還需要多線程、負載平衡等方面的東西)。比較常用的有C/C++、java,其他的比如Delphi、Vb等工具對Socket的操作就有點不方便。要開發一個高效率、穩定、可擴展的服務器端程序并不是一件很簡單的事情,最好能找點相應的資料深入學習一下,剛入門的時候,學習的重點可以放在Socket和多線程上面。下面以比較流行的java語言來舉例說明服務器端程序的簡單架構:
//運用多線程防止服務器阻塞
public class MultiThreadServer extends Thread
{
private ServerSocket listen_socket;
public MultiThreadServer(int port)
{
try
{
listen_socket = new ServerSocket(port); //創建一個服務器端的Socket
this.start(); //啟動多線程
}
catch(IOException e) //捕捉異常
{
e.printStackTrace();
}
}
//下面為服務器監聽線程的主程序。
public void run()
{
while(true) //死循環,一直在端口上監聽有無客戶端的Socket連接
{
try
{
//有客戶端連接上來,創建一個相應的Socket,并啟動響應的函數
Socket client_socket= listen_socket.accept();
SockState sstate=new SockState(client_socket);
OperThread oper=new OperThread(sstate);
}catch(Exception ee)
{
System.out.print(\"MultiThreadServer run:\"+ee.getMessage());
}
}
}
}
3 XML在Flash中主要涉及兩方面的應用,本地應用和網絡應用
本地應用主要是存取XML文件中所保存的數據,這里所指的數據并不一定限定是文本數據,也可以是圖片數據,聲音數據等等。比如可以用Flash + XML來做圖片管理器,歌曲列表管理器,用處還是比較大的,也比較靈活。
網絡應用是XML在Flash中的主要用途,它的優缺點在前面內容中已經提到。比如說,可以用來做電子商務方面的應用、論壇、聊天室等等。
參考文獻:
[1] 賀小霞,Flash 8 動畫制作.清華大學出版社,2006.
[2] 耿祥義.新編精品教材庫XML基礎教程.清華大學出版社,2006.
[3] Didier Martin.xml高級編程.機械工業出版社,2001.
[4] 丘廣華.XML編程實例教程.科學出版社,2004.