1. 程式人生 > >詳細介紹Flex中操作XML (轉)

詳細介紹Flex中操作XML (轉)

一  在介紹Flex中操作XML之前,首先簡單介紹下XML中的基本術語。    

元素:XML中擁有開始標籤和結束標籤的這一塊稱為“元素”    
節點:把XML元素與文字結合起來統稱為節點    
根節點:位於整個XML文當頂端的節點    
文字節點:包含文字的節點    
屬性:元素的組成部分,以鍵/值形式放在元素標籤內  

用一個例子來說明

  1. <root_node><!--這是一個根節點也是一個元素-->
  2. <nodeattribute="value"><!--這是一個節點也是一個元素,其中包含有屬性"attribute"-->
  3. text node
    <!--這是一個文字節點-->
  4. </node>
  5. </root_node>

<root_node><!--這是一個根節點也是一個元素--> <node attribute="value"><!--這是一個節點也是一個元素,其中包含有屬性"attribute"--> text node<!--這是一個文字節點--> </node> </root_node>

XML簡單介紹完了;之後,將分別介紹XML物件的建立,XML物件的處理以及XML物件的運用。

二  Flex中建立XML物件

Flex中建立XML物件的方法有很多種,可以根據該XML物件的用途來決定使用哪種方法

1.建立一個XML物件,直接把XML文字賦給這個物件

  1. var textXmlObj:XML = <test><element>text</element></test>;  

var textXmlObj:XML = <test><element>text</element></test>;

注意:這裡等號右邊的表示式不用加上引號,因為AS認識它,知道它是一個XML,如果加上引號就成了String型別了,編譯也無法通過。

當然也可以動態的決定XML文字中的內容,用"{變數}"的方式插入到XML文字中。

  1. var text_node:String = "text";   
  2. var textXmlObj:XML = <test><element>{text_node}</element></test>;  

var text_node:String = "text"; var textXmlObj:XML = <test><element>{text_node}</element></test>;

2.建立一個XML物件,並在構造方法中傳入字串作為XML文字

我們平時在程式設計工作中,往往會以字串的方式得到一個XML文字,這個時候就可以使用XML的構造方法來建立一個XML物件。

  1. var myText:String = "text";   
  2. var str:String = "<test><element>"+ myText + "</element></test>";   
  3. var textXmlObj:XML = new XML(str);  

var myText:String = "text"; var str:String = "<test><element>"+ myText + "</element></test>"; var textXmlObj:XML = new XML(str);

3.從外部載入XML物件

對於比較大一點的XML文字來說,從外部載入無疑是最好的方式了,因為如果硬寫在程式中,就算是對XML物件進行最簡單的修改都是一個大災難。

外部載入這裡介紹2種方式

1)如果你不是在Flex中開發而只是在比如Flash CS3中開發的話,可以使用下面的這種方法來載入外部XML

  1. import flash.events.Event;             
  2. import flash.net.URLLoader;            
  3. import flash.net.URLRequest;               
  4. var externalXML:XML;               
  5. var loader:URLLoader = new URLLoader();            
  6. var request:URLRequest = new URLRequest("xmlFile.xml");            
  7. loader.load(request);              
  8. loader.addEventListener(Event.COMPLETE, onComplete);               
  9. function onComplete(event:Event):void
  10. {              
  11. var loader:URLLoader = event.target as URLLoader;               
  12. if (loader != null)             
  13.     {               
  14.         externalXML = new XML(loader.data);             
  15.         trace(externalXML.toXMLString());               
  16.     }               
  17. else
  18.     {               
  19.         trace("loader is not a URLLoader!");            
  20.     }               
  21. }             

import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; var externalXML:XML; var loader:URLLoader = new URLLoader(); var request:URLRequest = new URLRequest("xmlFile.xml"); loader.load(request); loader.addEventListener(Event.COMPLETE, onComplete); function onComplete(event:Event):void {     var loader:URLLoader = event.target as URLLoader;     if (loader != null)     {         externalXML = new XML(loader.data);         trace(externalXML.toXMLString());     }     else     {         trace("loader is not a URLLoader!");     } }

2) 如果是在Flex開發環境中就可以使用HttpService來載入外部的XML;如果這裡看不懂程式碼沒關係,後面將細緻的介紹下面的這種處理方式

  1. <?xml version="1.0" encoding="utf-8"?>                                   
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
  3.     creationComplete="unitRPC.send()">                              
  4.     <mx:HTTPService id="unitRPC"
  5.         url="xmlFile.xml"
  6.             result="unitRPCResult(event)"/>                             
  7.     <mx:Script>                                  
  8.         <!--[CDATA[                             
  9. import mx.rpc.events.ResultEvent;                          
  10. privatefunction unitRPCResult(event:ResultEvent):void {                           
  11.             }                          
  12.         ]]-->                               
  13.     </mx:Script>                                 
  14. </mx:Application>                               

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="unitRPC.send()"> <mx:HTTPService id="unitRPC" url="xmlFile.xml" result="unitRPCResult(event)"/> <mx:Script> <!--[CDATA[ import mx.rpc.events.ResultEvent; private function unitRPCResult(event:ResultEvent):void { } ]]--> </mx:Script> </mx:Application>

三 對XML物件進行處理

在介紹XML物件的處理之前,介紹一個擴充套件語言"E4X",E4X大大簡化了傳統對XML的操作方式(如DOM介面)。

你會發現在程式中E4X操作XML是如此的簡單,懶人們都樂壞了。

這裡先給出一個XML物件,後面都將對這個物件進行操作

  1. var myXML:XML =            
  2. <books>              
  3.   <book name="flex tutorial">               
  4.     <price>30</price>               
  5.     <author>adobe</author>              
  6.   </book>               
  7.   <book name="sliverlight tutorial">            
  8.     <price>40</price>               
  9.     <author>microsoft</author>              
  10.   </book>               
  11.   <book name="java tutorial">               
  12.     <price>50</price>               
  13.     <author>sun</author>            
  14.   </book>               
  15.   <author>cyeric</author> //這是沒有意義的一個節點,只是為了後面的演示 
  16. </books>            

var myXML:XML = <books>   <book name="flex tutorial">     <price>30</price>     <author>adobe</author>   </book>   <book name="sliverlight tutorial">     <price>40</price>     <author>microsoft</author>   </book>   <book name="java tutorial">     <price>50</price>     <author>sun</author>   </book>   <author>cyeric</author> //這是沒有意義的一個節點,只是為了後面的演示 </books>

1)查詢   
使用"."操作符查詢節點,使用"[]"訪問指定索引的節點   

trace(myXML.book[0]) ;

輸出   
<book name="flex tutorial">   
  <price>30</price>   
  <author>adobe</author>   
</book>   
輸出內容說明,得到了第一個子節點;另外,如果我們想查詢所有book節點的話只需要把[0]去掉就可以了。  

使用".."操作符訪問所有以該標籤命名的節點,而忽略節點的上下關係,注意最後那個節點

trace(myXML..author);

輸出
<author>adobe</author>
<author>microsoft</author>
<author>sun</author>
<author>cyeric</author>

可以看到,不管author位於哪個位置,都列印了出來

使用"@"操作符訪問節點屬性

trace(myXML.book[0][email protected])

輸出
flex tutorial
第一個子節點的name屬性就被列印了出來
以上這4個操作符號".","[]","..","@" 即為最常用的4個E4X操作符,簡單吧,下面就循序漸進。

在查詢過程中可以使用E4X的過濾功能,假如我現在只想查詢價格在50塊以下的書,我們可以這樣

trace(myXML.book.(price<50));

輸出
<book name="flex tutorial">
  <price>30</price>
  <author>adobe</author>
</book>
<book name="sliverlight tutorial">
  <price>40</price>
  <author>microsoft</author>
</book>
價格為50元的那本書就沒有打印出來了。


屬性也可以過濾

  1. trace(myXML.book.(@name=='flex tutorial'));  

trace(myXML.book.(@name=='flex tutorial'));

輸出
<book name="flex tutorial">
  <price>30</price>
  <author>adobe</author>
</book>

我們還可以把查詢到的XML文字給改了,比如書店要把書都處理掉,然後叫賣:"5元5元一律5元"。

trace(myXML.book.(price=5));

輸出
<book name="flex tutorial">
  <price>5</price>
  <author>adobe</author>
</book>
<book name="sliverlight tutorial">
  <price>5</price>
  <author>microsoft</author>
</book>
<book name="java tutorial">
  <price>5</price>   
  <author>sun</author>   
</book>   

2) 修改,修改XML物件包括修改,新增和刪除操作   
雖然在介紹查詢的時候介紹過可以在查詢到XML文字的時候把它的內容給修改了。   
   
這裡先給出一個XML物件,後面都將對這個物件進行操作   

  1. var myXML:XML =      
  2. <books>
  3. <bookname="flex tutorial">
  4. <price>30</price>
  5. <author>adobe</author>
  6. </book>
  7. </books>

var myXML:XML = <books> <book name="flex tutorial"> <price>30</price> <author>adobe</author> </book> </books>

新增元素/節點,使用insertChildBefore和insertChildAfter方法在某一位置新增元素/節點,appendChild和prependChild方法在最前和最後新增元素/節點 

  1. myXML.insertChildAfter(myXML.book[0],<newbook name="After"/>);    
  2. myXML.insertChildBefore(myXML.book[0],<newbook name="Before"/>);    
  3. myXML.appendChild(<newbook name="Append"/>);    
  4. myXML.prependChild(<newbook name="Prepend"/>);    
  5. trace(myXML);   

myXML.insertChildAfter(myXML.book[0],<newbook name="After"/>); myXML.insertChildBefore(myXML.book[0],<newbook name="Before"/>); myXML.appendChild(<newbook name="Append"/>); myXML.prependChild(<newbook name="Prepend"/>); trace(myXML);
輸出 
<books> 
  <newbook name="Prepend"/> 
  <newbook name="Before"/> 
  <book name="flex tutorial"> 
    <price>30</price> 
    <author>adobe</author> 
  </book> 
  <newbook name="After"/> 
  <newbook name="Append"/> 
</books> 
在第一個元素的前後各添加了一個元素 

新增屬性,直接使用E4X帶來的便利 

  1. myXML.book[0][email protected]="2008";    
  2. trace(myXML);   

myXML.book[0][email protected]="2008"; trace(myXML);
輸出 
<books> 
  <book name="flex tutorial" date="2008"> 
    <price>30</price> 
    <author>adobe</author> 
  </book> 
</books> 

修改XML物件 

  1. myXML.book[0].author="奧多比";    
  2. trace(myXML);     

myXML.book[0].author="奧多比"; trace(myXML);

<books>   
  <book name="flex tutorial">   
    <price>30</price>   
    <author>奧多比</author>   
  </book>   
</books>   
也很簡單,修改屬性的方法也是一樣   

刪除元素節點,屬性等,使用delete關鍵字   

  1. delete myXML.book[0][email protected];      
  2. delete myXML.book[0].author;      
  3. delete myXML.book[0].price.text()[0];      
  4. trace(myXML);     

delete myXML.book[0][email protected]; delete myXML.book[0].author; delete myXML.book[0].price.text()[0]; trace(myXML);

輸出   
<books>   
  <book>     
    <price/>     
  </book>     
</books>     

四 在Flex中使用XML的例子

大的XML文件用來顯示資料或者顯示列表的情況比較多,比如顯示資料時作為Datagrid的資料來源,或者為List,Combobox,Tree等的顯示列表。

當我們使用List或者Combobox的時候,往往會把XML物件轉換為ArrayCollection物件,看下面的例子

外部Xml檔案 

  1. <books>
  2. <bookname="flex tutorial">
  3. <price>30</price>
  4. <author>adobe</author>
  5. </book>
  6. <bookname="air tutorial">
  7. <price>40</price>
  8. <author>adobe</author>
  9. </book>
  10. <bookname="java tutorial">
  11. <price>50</price>
  12. <author>sun</author>
  13. </book>
  14. </books>

<books> <book name="flex tutorial"> <price>30</price> <author>adobe</author> </book> <book name="air tutorial"> <price>40</price> <author>adobe</author> </book> <book name="java tutorial"> <price>50</price> <author>sun</author> </book> </books>

Flex檔案

  1. <?xml version="1.0" encoding="utf-8"?>                   
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  3.  layout="absolute"
  4.  creationComplete="init()">                 
  5.   <mx:Script>                
  6.   <!--[CDATA[                   
  7. import mx.collections.ArrayCollection;                   
  8. import mx.rpc.events.ResultEvent;                
  9. //用於資料繫結的ArrayCollection              
  10.       [Bindable]privatevar externalData:ArrayCollection = new ArrayCollection();                  
  11. privatefunction init():void {                   
  12. //傳送請求                
  13.           myService.send();                
  14.       }                
  15. privatefunction resultHandler(event:ResultEvent):void {                 
  16. //取得Xml物件中book節點的集合               
  17.           externalData = event.result.books.book;                  
  18.       }//斷點處                
  19.   ]]-->                 
  20.   </mx:Script>                   
  21.   <!--建立Httpservice物件載入外部Xml-->                  
  22.   <mx:HTTPService id="myService"
  23.       url="xmlFile.xml"
  24.       result="resultHandler(event)"/>                   
  25.   <!--用於顯示的list-->                   
  26.   <mx:List id="datalist" dataProvider="{externalData}" labelField="name"/>                           
  27. </mx:Application>               

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <!--[CDATA[ import mx.collections.ArrayCollection; import mx.rpc.events.ResultEvent; //用於資料繫結的ArrayCollection [Bindable]private var externalData:ArrayCollection = new ArrayCollection(); private function init():void { //傳送請求 myService.send(); } private function resultHandler(event:ResultEvent):void { //取得Xml物件中book節點的集合 externalData = event.result.books.book; }//斷點處 ]]--> </mx:Script> <!--建立Httpservice物件載入外部Xml--> <mx:HTTPService id="myService" url="xmlFile.xml" result="resultHandler(event)"/> <!--用於顯示的list--> <mx:List id="datalist" dataProvider="{externalData}" labelField="name"/> </mx:Application>

將上面的程式碼以debug模式執行,程式停在斷點處,在variables檢視中我們可以很清晰的看到程式HttpService物件在載入外部XML後已經把它轉換成了ArrayCollection物件,如下圖。這樣就可以很輕鬆的將資料來源繫結到顯示列表物件List中。

另外一種情況,當我們使用Tree元件的時候,需要在HTTPService物件中加上resultFormat="e4x"以XML的格式讀取進來而不要轉換為ArrayCollection。

外部XML檔案

  1. <books>      
  2. <category name="RIA">    
  3.     <book name="flex tutorial" price="30" author="adobe">   
  4.     </book>      
  5.     <book name="air tutorial" price="40" author="adobe">     
  6.     </book>      
  7. </category>          
  8. <category name="Java">           
  9.     <book name="java tutorial" price="50" author="sun">      
  10.     </book>      
  11. </category>          
  12. </books>        

<books> <category name="RIA"> <book name="flex tutorial" price="30" author="adobe"> </book> <book name="air tutorial" price="40" author="adobe"> </book> </category> <category name="Java"> <book name="java tutorial" price="50" author="sun"> </book> </category> </books>

Flex檔案

  1. <?xml version="1.0" encoding="utf-8"?>               
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  3.  layout="absolute"
  4.  creationComplete="myService.send()">               
  5.   <mx:HTTPService id="myService"
  6.     url="xmlFile.xml"
  7.     resultFormat="e4x"/>        
  8. <mx:XMLListCollection id="booktreesrc"
  9.     source="{myService.lastResult.category}"/>          
  10. <mx:Tree id="bookTree"
  11.     height="100%"
  12.     dataProvider="{booktreesrc}"
  13.     labelField="@name"/>        
  14. </mx:Application>           

<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="myService.send()"> <mx:HTTPService id="myService" url="xmlFile.xml" resultFormat="e4x"/> <mx:XMLListCollection id="booktreesrc" source="{myService.lastResult.category}"/> <mx:Tree id="bookTree" height="100%" dataProvider="{booktreesrc}" labelField="@name"/> </mx:Application>

畫面顯示

另外,在指定元素前和後插入,在最前端和尾端插入
var example:XML = <person/>;
example.two = "";
example.insertChildBefore(example.two, <one/>); //在two節點前插入one節點
example.insertChildBefore(example.two, "在two節點前插入文字");
example.insertChildAfter(example.two, <three/>); //在two節點後插入three節點
example.prependChild(<start/>); //在最頂端插入start節點
example.appendChild(<end/>); //在尾端插入end節點
example.start = "start內容"; //向節點增加內容
trace(example);
/*
輸出:
<person>
  <start>start內容</start>
  <one/>
  在two節點前插入文字
  <two/>
  <three/>
  <end/>
</person>
*/

相關推薦

詳細介紹Flex操作XML

一  在介紹Flex中操作XML之前,首先簡單介紹下XML中的基本術語。     元素:XML中擁有開始標籤和結束標籤的這一塊稱為“元素”    節點:把XML元素與文字結合起來統稱為節點    根節點:位於整個XML文當頂端的節點    文字節點:包含文字的節點    屬性:元素的組成部分,以鍵/值形式放

Linux常用操作命令

備份 並不會 使用方法 nts 系統 版本 不定 vim常用 相同 1、cd命令 這是一個非常基本,也是大家經常需要使用的命令,它用於切換當前目錄,它的參數是要切換到的目錄的路徑,可以是絕對路徑,也可以是相對路徑。如: [plain] view plain

取自ACE的bit操作

查看 disable amp work .cpp log get lin 影響 1 # define ACE_BIT_ENABLED(WORD, BIT) (((WORD) & (BIT)) != 0 ) 2 # define ACE_BIT_DISAB

理解並使用.NET 4.5的HttpClient

nts 定制 creat exit sta ogg 服務器 nal view 原文地址:http://www.cnblogs.com/wywnet/p/httpclient.html HttpClient介紹HttpClient是.NET4.5引入的一個HTTP客戶端庫,

Python語言在人工智能(AI)的優勢

巴西 luci ant p s 天使 不惜 ray 這也 招聘網站 本文探討了Python語言在AI領域的優勢與運用。 誰會成為AI 和大數據時代的第一開發語言? 這本已是一個不需要爭論的問題。如果說三年前,Matlab、Scala、R、Java 和 python還各有機

eclipse使用Lombok

clip .net ubun class 添加 code pan otc soft 原文鏈接:https://www.cnblogs.com/justuntil/p/7120534.html windows環境 1.下載lombok.jar包https://projec

新唐ISP操作步驟

too 模式 usb 連線 com In 點擊 代碼下載 art 1,電腦上裝上“NuMicro_ICP_Programming_Tool_v1.18.5320.zip”;2,把目標板通過SWD口的NU-LINK連接到電腦的USB口上;3,打開桌面的“NuMicro ICP

Git介紹及常用操作演示--技術流ken

Git介紹及常用操作演示(一)--技術流ken   Git介紹    Git(讀音為/gɪt/。)是一個開源的分散式版本控制系統,可以有效、高速的處理從很小到非常大的專案版本管理。 Git 是 Linus Torvalds 為了幫助管理 Linux 核心

VS拒絕在if語句賦值

以前節選的內容,出處忘記了。 讓Visual C++拒絕在if語句的條件表示式中賦值 一旦不小心把if (c == '+') {}寫成了if (c = '+') {}是多麼地悲劇。 寫成下邊這樣吧if ('+' == c) {}又違揹人的直覺。 解決辦法:設定project的property,在C/C

【轉載】DELPHI操作excel

DELPHI操作excel(轉) (一) 使用動態建立的方法 首先建立 Excel 物件,使用ComObj: var ExcelApp: Variant; ExcelApp := CreateOleObject( ''Excel.Application'' );

位運算在角色許可權設計的應用

1.引言 2.位運算基礎 3.位運算在角色許可權設計中的應用 4.為什麼in32的範圍是-2^31 ~ 2^31-1 ? 5.同餘的概念 6.模的概念幫助理解補數和補碼。  一、引言 這周在做一個新增角色許可權需求時,遇到下面這樣一行程式碼,這篇文章將圍繞這行程式碼展開。 us

C#操作Word8—— 向Word插入圖表的三種方法

一、 前言         本文主要介紹向word中插入圖表的方法。方法共有三種,每一種都有自己的適用範圍和利弊。介紹之前,我們準備實驗用的文件,做一個如下圖所示的word模板,我們要做的的是在這個名叫chart的書籤中插入一個圖表,下面然後我將逐一進行介紹這三種方法:

Ibatisinsert用法

在Ibatis中,insert()的返回值為一個Object的主鍵,其實這個Object的主鍵是這樣的來的:如果在bean的xml檔案中設定了插入的keyProperty,則insert()方法返回的就是這個主鍵的值。     例如,所以我們想要在插入時想要插入一個sequence值到資料庫的某個

C語言登錄檔操作例項

#include <stdio.h>#include <windows.h>int main(void){char regname[]="Software//Microsoft//Windows//CurrentVersion//Run";HKEY hkResult;int ret=R

C#操作Word5—— 利用BookMark物件寫Word文件

一、引言         本文主要介紹通過Word中的書籤Bookmark來向Word中寫入我們自定義的資料。之前的文章介紹了利用Range物件讀寫word的方法,用這種方法如果處理比較簡單的文件還好,若文件較複雜,就顯得有些力不從心了。         比如有這麼一個文件

C#操作Word2—— 新建、開啟、儲存和關閉文件

       本文中主要介紹C#中對word文件進行新建、開啟、儲存、關閉的方法。在本次試驗之前,先佈置試驗環境。首先,先新建一個winform的工程WordTest:         然後,在介面中新增一個按鈕,按鈕文字就叫做“測試”:         在按鈕的點選事

C#操作Excel4—— 向Excel插入兩種圖表以及設定圖表格式

一、引言         本文主要討論下向Excel中插入圖表的兩種方式。在Excel中圖表是有兩種級別的,一種是和sheet同級別的圖表,也就是說整個excel的標籤頁就是一個圖表;還有一種就是我們最常使用的在一個sheet中插入的圖表,我們姑且叫它sheet子圖表。這

Scala協變(+)、逆變(-)、上界(<:)、下界(>:)簡單介紹

定義類 word ref 一個 pla 而不是 關系 repl 協變 看源碼的時候看到: trait ExtensionId[T <: Extension] {沒見過這個符號啊<: Scala上界(<:)和下界(>:) 1) U >: T

DNS的七大資源記錄介紹

多臺 .html 缺少 自己 平衡 控制 color ron read 原址 在Microsoft產品系列中,ADDS是一個很出色的設計平臺,說到AD,那麽我們就不得不提起他的合作夥伴--DNS,相信大家都知道,DNS在AD中的重要地位,就如男人和女人一樣,要想有所作為

CentOS 6.9配置網卡IP/網關/DNS命令詳細介紹及一些常用網絡配置命令

linux. centos fly fig details oba routing href 修改dns 一、IP 即時生效(重啟後失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 r