日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Flex論壇 AS3中新的XML處理方法 - E4X - flexcoders

 ShangShujie 2007-10-15
AS3中新的XML處理方法 - E4X
AcriontScript之前的版本(從Flash 5中的ActionScript開(kāi)始)有一些處理XML數(shù)據(jù)的類(lèi)和方法,但是它們并不是基于ECMAScript標(biāo)準(zhǔn)的。
新的ECMA腳本語(yǔ)言規(guī)范第4版草稿中定義了一系列新的處理XML數(shù)據(jù)的類(lèi)和方法。這些類(lèi)和方法的集合并命名為E4X("ECMAScript for XML"),ActionScript 3.0包括如下新的E4X類(lèi): XMLXMLList、 QNameNamespace。
E4X類(lèi)的方法、屬性和操作的開(kāi)法基于以下的目標(biāo):
  • 簡(jiǎn)單--E4X盡可能的使得處理XML數(shù)據(jù)的代碼容易編寫(xiě)并且易于理解。
  • 一致性--E4X的方法于Actionscript的其它部分協(xié)調(diào)一致。
  • 友好--實(shí)用非常好理解的操作符處理XML數(shù)據(jù),如點(diǎn)號(hào)(.)。
注意:為避免與E4X中的新的XML類(lèi)沖突,原來(lái)ActionScript 2.0中的XML類(lèi)在ActionScript 3.0被重命名為XMLDocument,為了向前兼容,在ActionScript 3.0中遺留下來(lái)的類(lèi)--XML、XMLNode、XMLParser和XMLTag--被包含進(jìn)了flash.xml包中。新的E4X類(lèi)是核心類(lèi)--使用它們不需要import任何包。
初始化XML對(duì)象
XML 對(duì)象可以代表一個(gè)XML元素、屬性、注釋、處理指令或文本元素。圩tem的id屬性值trace(myXML.item[0].@id); //Output:1 //獲取id屬性為2的item的menuName值trace(myXML.item.(@id==2).menuName); // Output: fries//獲取menuName為burger的item的price值trace(myXML.item.(menuName== "burger").price); // Output: 3.95

你也可以使用appendChild()方法給XML添加新的子節(jié)點(diǎn):
var newItem:XML =
<item id="3">
<menuName>medium cola</menuName>
<price>1.25</price>
</item>
myXML.appendChild(newItem);
當(dāng)然你也可以使用@和.操作符來(lái)更新數(shù)據(jù):
myXML.item[0].menuName="regular burger";
myXML.item[1].menuName="small fries";
myXML.item[2].menuName="medium cola";
myXML.item.(menuName=="regular burger").@quantity = "2";
myXML.item.(menuName=="small fries").@quantity = "2";
myXML.item.(menuName=="medium cola").@quantity = "2";
訪問(wèn)XML數(shù)據(jù)
你可以使用.(點(diǎn)號(hào))和..操作符訪問(wèn)XML對(duì)象的子節(jié)點(diǎn),使用@操作符訪問(wèn)某一節(jié)點(diǎn)的屬性??紤]以下XML對(duì)象:
var x:XML =
<book ISBN="0942407296">
<title>Baking Extravagant Pastries with Kumquats</title>
<author>
<lastName>Contino</lastName>
<firstName>Chuck</firstName>
</author>
<pageCount>238</pageCount>
</book>
<book ISBN="0865436401">
<title>Emu Care and Breeding</title>
<editor>
<lastName>Case</lastName>
<firstName>Justin</firstName>
</editor>
<pageCount>115</pageCount>
</book>
</order>
對(duì)象x.book表示一個(gè)包含所有名稱(chēng)為book的子節(jié)點(diǎn)的XMLList對(duì)象,該XMLList包含兩個(gè)XML對(duì)象(兩個(gè)book節(jié)點(diǎn))。
對(duì)象x..lastName表示一個(gè)包含XML樹(shù)結(jié)構(gòu)下部所有的lastName屬性的XMLList對(duì)象,該XMList包含兩個(gè)XML對(duì)象(兩個(gè)LastName屬性)。
對(duì) 象x.book.editor.lastName表示一個(gè)包含所有x對(duì)象的所有名稱(chēng)為book的子節(jié)點(diǎn)的所有名稱(chēng)為editor的子節(jié)點(diǎn)的所有 lastName節(jié)點(diǎn)的XMLList對(duì)象,該XMLList只包含一個(gè)XML對(duì)象(值為"Case"的lastName屬性)。
訪問(wèn)父節(jié)點(diǎn)和子節(jié)點(diǎn)
parent()方法返回XML對(duì)象的父節(jié)點(diǎn)。
你可以使用子節(jié)點(diǎn)列表的順序索引值來(lái)訪問(wèn)特定的子節(jié)點(diǎn),例如,假定某一XML對(duì)象x有兩個(gè)名稱(chēng)為book的子節(jié)點(diǎn),你可以如下訪問(wèn)它們:
//第1個(gè)book節(jié)點(diǎn)
x.book[0]
//第2個(gè)book節(jié)點(diǎn)
x.book[1]
要訪問(wèn)孫子節(jié)點(diǎn),我們可以如下直接使用兒子和孫子節(jié)點(diǎn)的索引值來(lái)訪問(wèn):
x.book[0].title[0]不過(guò)如果x.book[0]只有一個(gè)名稱(chēng)為title的子節(jié)點(diǎn)的話,那么可以省略索引:
x.book[0].title類(lèi)似的,如果x對(duì)象只有一個(gè)book子節(jié)點(diǎn),并且該book節(jié)點(diǎn)的子節(jié)點(diǎn)對(duì)象只有一個(gè)title對(duì)象,那么兩個(gè)索引值都可以省略:
x.book.title
注意,你也可以使用child()方法,直接使用名稱(chēng)訪問(wèn)特定的子節(jié)點(diǎn):
var x.XML =
<order>
<book>
<title>Dictionary</title>
</book>
</order>
var childName:String = "book";
trace (x.child(childName).title) // Output: Dictionary
訪問(wèn)屬性
我們使用使用@操作符訪問(wèn)XMLNode屬性:
var myXML:XML =
<order>
<item id=‘1‘>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id=‘2‘>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
//獲取第1個(gè)item的id屬性值
trace(myXML.item[0].@id);//Output:1
使用屬性或元素值過(guò)濾XML數(shù)據(jù)
我們可以使用特定的元素名稱(chēng)和屬性值來(lái)定位到特定的元素考慮以下XML對(duì)象:
var x:XML =
<employeeList>
<employee id="347">
<lastName>Zmed</lastName>
<firstName>Sue</firstName>
<position>Data analyst</position>
</employee>
<employee id="348">
<lastName>McGee</lastName>
<firstName>Chuck</firstName>
<position>Jr. data analyst</position>
</employee>
</employeeList>
以下是正確的訪問(wèn)方法:
//lastName為“McGee”的employee對(duì)象,第1個(gè)employee節(jié)點(diǎn)
x.employee.(lastName == "McGee") // The first employee node
//lastName為“McGee”的employee對(duì)象的firstName節(jié)點(diǎn),第1個(gè)employee節(jié)點(diǎn)的節(jié)點(diǎn)
x.employee.(lastName == "McGee").firstName // The firstName property of that node
//lastName為“McGee”的id屬性
x.employee.(lastName == "McGee").@id // The value of the id attribute
//所有id屬性值為347的employee對(duì)象列表
x.employee.(@id == 347)
//id屬性值為347的employee對(duì)象的lastName子節(jié)點(diǎn)
x.employee.(@id == 347).lastName
//所有id屬性值大于347的employee對(duì)象列表
x.employee.(@id > 300) // An XML list with both employee properties
//所有position子節(jié)點(diǎn)值包含“analyst”的employee對(duì)象列表
x.employee.(position.toString().search("analyst") > -1)
使用for ... in和for each ... in 語(yǔ)句
ActionScript 3.0 包括了一個(gè)新用來(lái)遍歷XMLList對(duì)象的的for ... in語(yǔ)句和for each ...in語(yǔ)句。例如,考慮以下XML對(duì)象,myXML和myXML..item XMLList對(duì)象(包含兩個(gè)item XML對(duì)象節(jié)點(diǎn)的XML列表):
var myXML:XML =
<order>
<item id=‘1‘ quantity=‘2‘>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<item id=‘2‘ quantity=‘2‘>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>
for ... in語(yǔ)句可以讓我們遍歷XMLList的所有屬性名稱(chēng),實(shí)際上就是個(gè)節(jié)點(diǎn)的索引值:
var total:Number = 0;
for (var pname:String in myXML..item)
{
total += Number(myXML.item.@quantity[pname]) * Number(myXML.item.price[pname]);
}
for each ... in語(yǔ)句遍歷XMLList的所有節(jié)點(diǎn):
var total2:Number = 0;
for each (var item:XML in myXML..item)
{
total2 += Number(item@quantity) * Number(item.price);
}
使用with語(yǔ)句
我們可以使用with語(yǔ)句,來(lái)指明后續(xù)的屬性和節(jié)點(diǎn)值都是基于某一XML對(duì)象,前面的for each ... in示例代碼,使用with語(yǔ)句的代碼如下:
var total:Number = 0;
for each (var item in myXML..item)
{
with (item)
{
//{內(nèi)的屬性和節(jié)點(diǎn)對(duì)象都是基于item XML對(duì)象的,所有不需要使用item.來(lái)訪問(wèn)。
total += Number(@quantity) * Number(price);
}
}
trace(total);
修改XML對(duì)象
我們可以使用prependChild()方法或者appendChild()方法在XML對(duì)象的子節(jié)點(diǎn)列表的前面或者最后面添加節(jié)點(diǎn):
var x1:XML = <p>Paragraph 1</p>
var x2:XML = <p>Paragraph 2</p>
var x:XML = <body></body>
x = x.appendChild(x1);
x = x.appendChild(x2);
x = x.prependChild(<p>Paragraph 0</p>);
// x == <body><p>Paragraph 0</p><p>Paragraph 1</p><p>Paragraph 2</p></body>
使用insertChildBefore()方法或者insertChildAfter()方法在特定的節(jié)點(diǎn)前面活著回后面添加節(jié)點(diǎn):
var x:XML =
<body>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</body>
var newNode:XML = <p>Paragraph 1.5</p>
x = x.insertChildAfter(x.p[0], newNode)
x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)
注意,我們也可以在構(gòu)造XML對(duì)象的時(shí)候使用大括號(hào)({和})來(lái)引用變量:
var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"],["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("<employeeList></employeeList>");
for (var i:int = 0; i < 3; i++) {
var newnode:XML = new XML();
newnode =
<employee id={ids}>
<last>{names[i][0]}</last>
<first>{names[i][1]}</first>
</employee>
x = x.appendChild(newnode)
}
我們也可以使用=操作符來(lái)給XML對(duì)象節(jié)點(diǎn)賦值:
var x:XML =
<employee>
<lastname>Smith</lastname>
</employee>
x.firstname = "Jean";
x.@id = "239";
以上代碼將把XML對(duì)象X設(shè)置成如下:
<employee id="239">
<lastname>Smith</lastname>
<firstname>Jean</firstname>
</employee>
我們也可以使用+和+=操作符來(lái)連結(jié)XMLList:
var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
xList += <c>test3</c>
[i]刪除XML對(duì)象

E4X 規(guī)范中定義有delete和deleteByIndex方法用來(lái)刪除特定的XML節(jié)點(diǎn),但是在當(dāng)前版本的ActionScript3.0實(shí)現(xiàn)中,并沒(méi)有實(shí) 現(xiàn)這兩個(gè)方法,所有我們不能直接使用這兩個(gè)方法,不過(guò)我們可以使用遍歷XML樹(shù),剔除特定的節(jié)點(diǎn),重新構(gòu)造新的XML對(duì)象的方法來(lái)刪除某一特定節(jié)點(diǎn),以下 我們將刪除employee的lastname子節(jié)點(diǎn):
private function deleteByIndex(xmlNode:XML,index:Number):XML{
var newStr:String=‘‘;
newStr+=‘<‘+xmlNode.localName();
for each (var att:XML in xmlNode.attributes()){
newStr+=‘ ‘+att.localName()+‘="‘+att.toString()+‘"‘;
}
newStr+=‘>‘;
var i:Number=0;
for each(var node:XML in xmlNode.children()){
if(i!=index)
newStr+=node.toXMLString();
i++;
}
newStr+=‘</‘+xmlNode.localName()+‘/>‘;
return new XML(newStr);
}
var myXML:XML=
<employee id="239">
<lastname>Smith</lastname>
<firstname>Jean</firstname>
<address>
<city>shangrao</city>
<load>daihu</load>
<no>5</no>
</address>
</employee>
myXML=deleteByIndex(myXML,0);
以上的deleteByIndex函數(shù)有兩個(gè)參數(shù),第1的參數(shù)是被刪除節(jié)點(diǎn)的父節(jié)點(diǎn),第2的參數(shù)是被刪除節(jié)點(diǎn)的在父節(jié)點(diǎn)的子節(jié)點(diǎn)列表中索引值。先遍歷父節(jié)點(diǎn)的索引屬性,然后遍歷其所有的子節(jié)點(diǎn),跳過(guò)我們要?jiǎng)h除的節(jié)點(diǎn),然后將它們組合成新的XML對(duì)象返回。
如果XML對(duì)象非常復(fù)雜,數(shù)據(jù)量必較大的話,以上刪除節(jié)點(diǎn)的實(shí)現(xiàn)方法效率是非常好低,所有正確的選擇還是使用E4X定義的刪除方法,不過(guò)這個(gè)功能要等到ActionScript 3.0的下一個(gè)測(cè)試版本才能夠?qū)崿F(xiàn)。
XML類(lèi)型轉(zhuǎn)換
我們可以將XML對(duì)象和XMLList對(duì)象轉(zhuǎn)換為字符串,同樣的,我們也可以將字符串轉(zhuǎn)換為XML對(duì)象和XMLList對(duì)象。順便,請(qǐng)記住所有的XML屬性值、名稱(chēng)和文本值都是字符串。
轉(zhuǎn)換XML和XMLList對(duì)象為字符串
XML 對(duì)象和XMLList對(duì)象都有有兩個(gè)成員方法:toString()和toXMLString()方法。toXMLString()方法返回包含所有標(biāo) 簽、屬性、命名空間聲明和XML對(duì)象內(nèi)容的字符串,對(duì)與復(fù)雜的XML對(duì)象(包含有子元素),toString()方法的效果和toXMLString() 方法的效果一樣,但是對(duì)與簡(jiǎn)單的XML對(duì)象(只包含一個(gè)文本元素),toString()方法只返回元素的文本內(nèi)容:
var myXML:XML =
<order>
<item id=‘1‘ quantity=‘2‘>
<menuName>burger</menuName>
<price>3.95</price>
</item>
<order>
trace(myXML.item0.menuName.toXMLString())
// Output: <menuName>burger</menuName>
trace(myXML.item0.menuName.toString())
// Output: burger
將文本字符串轉(zhuǎn)換為XML對(duì)象
我們可以使用new構(gòu)造方法從字符串創(chuàng)建一個(gè)XML對(duì)象
var x:XML = new XML(‘<a>test<b>‘);但是如果我們?cè)噲D將一個(gè)非XML或者結(jié)構(gòu)不完整的字符串轉(zhuǎn)換為XML對(duì)象,那么將會(huì)報(bào)運(yùn)行時(shí)錯(cuò)誤:
var x:XML = new XML(‘<a>test‘); // Throws an error從Internet讀取Rss Fead數(shù)據(jù)
以下代碼將讀取本站的rss fead數(shù)據(jù):
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2005/mxml" xmlns="*" creati>
<mx:Script>
<![CDATA[
private function doInit():Void{
getRssData("http://blog./rss.php",ta_view);
}
public function getRssData(url:String, outTxt:TextArea):Void
{
private var myXMLURL:URLRequest = new URLRequest(url);
private var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);
}
private function xmlLoaded(event:Event):Void{
ta_view.text=‘load ok‘;
var myLoader:URLLoader = URLLoader(event.target);
XML.ignoreProcessingInstructions=false;
var myXML:XML =new XML(myLoader.data);
private var outStr:String = "";
for each (var item:XML in myXML.children()) {
if(item.localName()==‘item‘){
outStr += "<p><b>" + item.children()0.toString() + ":</b></p><p>";
outStr += item.children()6.toString() ;
outStr += " <br/><a href=‘" + item.children()1.toString();
outStr += "‘><font color=‘#008000‘>More...</font></a></p>";
}
}
//ta_view.text=myXML.toString();
ta_view.htmlText = outStr;
}
]]>
</mx:Script>
<mx:Canvas width="100%" height="100%">
<mx:TextArea id="ta_view">
<mx:layoutConstraints>
<mx:EdgeAnchor bottom="10" top="10" left="10" right="10"/>
</mx:layoutConstraints>
</mx:TextArea>
</mx:Canvas>
</mx:Application>
運(yùn)行示例(FlashPlayer8.5 required)
注 意,我們沒(méi)有直接使用節(jié)點(diǎn)名稱(chēng)訪問(wèn)節(jié)點(diǎn)(不知道為什么,如果使用item.title訪問(wèn)title節(jié)點(diǎn)的話,返回是空的,可能跟我的RSSXML的中 rdf指令有關(guān),如果有朋友知道解決的辦法,請(qǐng)告訴我),而是使用了children()方法,該方法返回某一XML對(duì)象的所有子節(jié)點(diǎn)對(duì)象,
獲取更多AS3中E4X類(lèi)的使用信息,請(qǐng)查看Adobe在線文檔,詳細(xì)API參考:Adobe Flex 2 API文檔
源至:http://blog./index.php/2006/01/04/164-flex2-actionscript3xml-e4x

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多