1、AS3处理XMLAS3处理XML 分类: Flex/AIR 2011-07-26 16:47 112人阅读 评论(0) 收藏 举报 写的有些乱,不过这些都是最简单直接的AS操作XML的方法初始化XML对象 XML对象可以代表一个XML元素、属性、注释、处理指令或文本元素。在ActionScript 3.0中我们可以直接将XML数据赋值给变量:var myXML:XML = burger 3.95 fries 1.45 你也可以使用new 构造器来从XML数据文本创建一个XML对象实例:var myXML:XML = new XML(burger3.95)如果XML数据不是格式完好的(如少了结束
2、标签),那么将会出现运行时错误。注意,你也可以将变量实例传入XML数据中:var tagname:String = item;var attributename:String = id;var attributevalue:String = 5;var content:String = Chicken;var x:XML = content;trace (x.toXMLString()/ Output: Chicken加载XML通常,我们的应用是从外部源导入XML数据,如web service或RSS feed,以下是一个从远程URL导入XML数据的例子:var myXML:XML = new
3、 XML();var XML_URL:String = /创建URLRequest。var myXMLURL:URLRequest = new URLRequest(XML_URL);/使用URLLoader导入数据。var myLoader:URLLoader = new URLLoader(myXMLURL);/添加事件监听器,以在XML数据导入完成后处理XML数据。myLoader.addEventListener(complete, xmlLoaded);/导入完成后,创建使用导入的数据创建XML对象function xmlLoaded(evtObj:Event) var myXML:
4、XML = XML(myLoader.data); trace(Data loaded.);也可以直接读取本地XMLvar fileStream:FileStream=new FileStream();fileStream.open(new File(c:111.xml), FileMode.READ);var contentXml:XML=new XML(fileStream.readUTFBytes(fileStream.bytesAvailable);fileStream.close();使用.和:用于访问属性:/获取第1个item的menuName值trace(myXML.item0.
5、menuName); / Output: burger/获取第1个item的id属性值trace(myXML.item0.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添加新的子节点:var newItem:XML = medium cola 1.
6、25 myXML.appendChild(newItem);当然你也可以使用和.操作符来更新数据:myXML.item0.menuName=regular burger;myXML.item1.menuName=small fries;myXML.item2.menuName=medium cola;myXML.item.(menuName=regular burger).quantity = 2;myXML.item.(menuName=small fries).quantity = 2;myXML.item.(menuName=medium cola).quantity = 2;访问XML
7、数据 你可以使用.(点号)和.操作符访问XML对象的子节点,使用操作符访问某一节点的属性。考虑以下XML对象: var x:XML = Baking Extravagant Pastries with Kumquats Contino Chuck 238 Emu Care and Breeding Case Justin 115 对象x.book表示一个包含所有名称为book的子节点的XMLList对象,该XMLList包含两个XML对象(两个book节点)。对象x.lastName表示一个包含XML树结构下部所有的lastName属性的XMLList对象,该XMList包含两个XML对象(两
8、个LastName属性)。对象x.book.editor.lastName表示一个包含所有x对象的所有名称为book的子节点的所有名称为editor的子节点的所有lastName节点的XMLList对象,该XMLList只包含一个XML对象(值为Case的lastName属性)。访问父节点和子节点 parent()方法返回XML对象的父节点。你可以使用子节点列表的顺序索引值来访问特定的子节点,例如,假定某一XML对象x有两个名称为book的子节点,你可以如下访问它们:/第1个book节点x.book0/第2个book节点x.book1要访问孙子节点,我们可以如下直接使用儿子和孙子节点的索引值来
9、访问:x.book0.title0不过如果x.book0只有一个名称为title的子节点的话,那么可以省略索引:x.book0.title类似的,如果x对象只有一个book子节点,并且该book节点的子节点对象只有一个title对象,那么两个索引值都可以省略:x.book.title注意,你也可以使用child()方法,直接使用名称访问特定的子节点:var x.XML = Dictionary var childName:String = book;trace (x.child(childName).title) / Output: Dictionary访问属性 我们使用使用操作符访问XMLN
10、ode属性:var myXML:XML = burger 3.95 fries 1.45 /获取第1个item的id属性值trace(myXML.item0.id);/Output:1使用属性或元素值过滤XML数据 我们可以使用特定的元素名称和属性值来定位到特定的元素考虑以下XML对象:var x:XML = Zmed Sue Data analyst McGee Chuck Jr. data analyst 以下是正确的访问方法:/lastName为“McGee”的employee对象,第1个employee节点x.employee.(lastName = McGee) / The firs
11、t employee node/lastName为“McGee”的employee对象的firstName节点,第1个employee节点的节点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对象列表x.employee.(id = 347)/id属性值为347的employee
12、对象的lastName子节点x.employee.(id = 347).lastName/所有id属性值大于347的employee对象列表x.employee.(id 300) / An XML list with both employee properties/所有position子节点值包含“analyst”的employee对象列表x.employee.(position.toString().search(analyst) -1)使用for . in和for each . in 语句 ActionScript 3.0 包括了一个新用来遍历XMLList对象的的for . in语句和
13、for each . in语句。例如,考虑以下XML对象,myXML和myXML.item XMLList对象(包含两个item XML对象节点的XML列表):var myXML:XML = burger 3.95 fries 1.45 for . in语句可以让我们遍历XMLList的所有属性名称,实际上就是个节点的索引值:var total:Number = 0;for (var pname:String in myXML.item) total += Number(myXML.item.quantitypname) * Number(myXML.item.pricepname);for
14、each . in语句遍历XMLList的所有节点:var total2:Number = 0;for each (var item:XML in myXML.item) total2 += Number(itemquantity) * Number(item.price);使用with语句 我们可以使用with语句,来指明后续的属性和节点值都是基于某一XML对象,前面的for each . in示例代码,使用with语句的代码如下:var total:Number = 0;for each (var item in myXML.item) with (item) /内的属性和节点对象都是基于
15、item XML对象的,所有不需要使用item.来访问。 total += Number(quantity) * Number(price); trace(total);修改XML对象 我们可以使用prependChild()方法或者appendChild()方法在XML对象的子节点列表的前面或者最后面添加节点:var x1:XML = Paragraph 1var x2:XML = Paragraph 2var x:XML = x = x.appendChild(x1);x = x.appendChild(x2);x = x.prependChild(Paragraph 0);/ x = P
16、aragraph 0Paragraph 1Paragraph 2使用insertChildBefore()方法或者insertChildAfter()方法在特定的节点前面活着回后面添加节点:var x:XML = Paragraph 1 Paragraph 2 var newNode:XML = Paragraph 1.5x = x.insertChildAfter(x.p0, newNode)x = x.insertChildBefore(x.p2, Paragraph 1.75)注意,我们也可以在构造XML对象的时候使用大括号(和)来引用变量:var ids:Array = 121, 12
17、2, 123;var names:Array = Murphy,Pat,Thibaut,Jean, Smith,Vijayvar x:XML = new XML();for (var i:int = 0; i 3; i+) var newnode:XML = new XML(); newnode = namesi0 namesi1 x = x.appendChild(newnode)我们也可以使用=操作符来给XML对象节点赋值:var x:XML = Smith x.firstname = Jean;x.id = 239;以上代码将把XML对象X设置成如下: Smith Jean 我们也可以使
18、用+和+=操作符来连结XMLList:var x1:XML = test1var x2:XML = test2var xList:XMLList = x1 + x2;xList += test3删除XML对象 E4X规范中定义有delete和deleteByIndex方法用来删除特定的XML节点,但是在当前版本的ActionScript 3.0实现中,并没有实现这两个方法,所有我们不能直接使用这两个方法,不过我们可以使用遍历XML树,剔除特定的节点,重新构造新的XML对象的方法来删除某一特定节点,以下我们将删除employee的lastname子节点:private function dele
19、teByIndex(xmlNode:XML,index:Number):XML var newStr:String=; newStr+=; var i:Number=0; for each(var node:XML in xmlNode.children() if(i!=index) newStr+=node.toXMLString(); i+; newStr+=; return new XML(newStr);var myXML:XML= Smith Jean shangrao daihu 5 myXML=deleteByIndex(myXML,0);以上的deleteByIndex函数有两
20、个参数,第1的参数是被删除节点的父节点,第2的参数是被删除节点的在父节点的子节点列表中索引值。先遍历父节点的索引属性,然后遍历其所有的子节点,跳过我们要删除的节点,然后将它们组合成新的XML对象返回。如果XML对象非常复杂,数据量必较大的话,以上删除节点的实现方法效率是非常好低,所有正确的选择还是使用E4X定义的删除方法,不过这个功能要等到ActionScript 3.0的下一个测试版本才能够实现。XML类型转换 我们可以将XML对象和XMLList对象转换为字符串,同样的,我们也可以将字符串转换为XML对象和XMLList对象。顺便,请记住所有的XML属性值、名称和文本值都是字符串。转换XM
21、L和XMLList对象为字符串 XML对象和XMLList对象都有有两个成员方法:toString()和toXMLString()方法。toXMLString()方法返回包含所有标签、属性、命名空间声明和XML对象内容的字符串,对与复杂的XML对象(包含有子元素),toString()方法的效果和toXMLString()方法的效果一样,但是对与简单的XML对象(只包含一个文本元素),toString()方法只返回元素的文本内容:var myXML:XML = burger 3.95 trace(myXML.item0.menuName.toXMLString()/ Output: burgertrace(myXML.item0.menuName.toString()/ Output:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1