as3 操作xml
引用:http://songwensheng.iteye.com/blog/644360
示例如下:Tree.mxml:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="menu.send();" layout="absolute">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
[Bindable]
private var myData:ArrayCollection;
private var menus2:XML;
private var results:XMLList;
private function resultHandler(event:ResultEvent):void {
menus2 = XML(event.result);
//proto子节点(即Field节点)xml对象的集合
var list:XMLList = menus2.packet.proto.children();
//删除hide的节点
for(var i:int=0;i<list.length();i++) {
if(list.@hide=="yes") {
delete list[i];//删除field中属性hide的field节点
Alert.show("del");
}
// if(menus2.packet.proto.field.@hide=="yes") {//原始操作方法
// delete menus2.packet.proto.field[i];//删除节点
// }
//位于列表下第三个对象是否有showname属性
var li:XMLList = list[i].attribute("showname");
if(li.length()==0) {//没有showname属性
//添加一个showname属性值是show的值
list[i].@showname=list[i].@show;
}
}
//增加属性
//menus2.packet.proto.field[0].@hello="helloword";
var results:XMLList = menus2.packet.proto;
Alert.show(results);
//将集合绑定到tree上
treeMenu.dataProvider = results;
}
private function modify():void {
delete menus2.packet.proto.field;
Alert.show(menus2.packet.proto.toString());
}
]]>
</mx:Script>
<mx:HTTPService id="menu" url="erb2.xml" result="resultHandler(event)" resultFormat="xml" />
<mx:Tree id="treeMenu" labelField="@showname" width="50%" height="100%">
</mx:Tree>
<mx:Button label="修改" click="modify()" x="427" y="53"/>
</mx:Application>
xml文件内容为:erb2.xml:
<?xml version="1.0"?>
<pdml version="0" creator="wireshark/1.0.8">
<packet>
<proto name="geninfo" pos="0" showname="General information" >
<field name="num" pos="0" hide="yes" show="1" showname="Number" value="1"/>
<field name="len" pos="0" show="115" showname="Packet Length"/>
<field name="len" pos="0" show="noshowname"/>
</proto>
</packet>
</pdml>
首先是修改:
修改XML节点其实比较简单,创建XML对象后,直接调用如下的方法:
A.insertChildBefore(a,b);//在a节点前插入b节点
A.insertChildAfter(a,b);//在a节点之后插入b
A.appendChild(a);//附加a文本子节点
A.prependChild(a);//把a加到前面
A.a.@b="c"//为a节点添加一个名为b的属性,其值为c
示例:(中间没有中断)
////////////////////////////////////////////////////////////////////////////////////
//创建XML
var A:XML=<a />;
//加入一个节点b
A.b=<b />;
//加入一个节点c,且值为11,如果存入数组,值为逗号隔开的文本,其中null,undefined将解析为空""
A.c="11";
//输出为:<a><b /><c>11</c></a>
trace(A);
//在c节点前插入一个<d />节点,insertChildAfter()等方法同理
A = A.insertChildBefore(A.c,<d />);
//输出内容:(略)
trace(A);
//添加属性
A.c.@e="true";
//输出内容:。。。
trace(A);
////////////////////////////////////////////////////////////////////////////////////
读取XML节点:
A.elements();//返回A节点下的所有元素
A.a;//返回A节点下的a节点的内容,如果有多个a节点,则使用a[n]来指定(n从0开始),返回后使用toString(),int(),Number()方法转换。
A.@a;//返回A节点的a属性的值,老方法attribute(a)还可以用~不过注意里面的a为属性名称~不过:
A.@*[n];//爆发吧~attribute用不着了~通配符*和@代替了。。。郁闷。。。
以上内容就不用示例了吧~~使用方法和写入方式类似~~~
删除:
使用关键字delete,后加个节点或属性或。。。的,就和读节点的方式一样就可以了。。。
例如:
//删除了A节点的a节点。。。
delete A.a;
//删除了A节点的b属性
delete A.@b;