Flex XML/XMLList 常用操作
1 XML、XMLList操作
Flex对xml提供了很多强大而灵活的操作。相对于其他语言,flex对xml的格式要求不那么苛刻,只要符合基本格式语法的字符串,flex能非常简单的转换成xml操作。
而实际上,xml是一种非常方便的层次数据描述格式。
1.1 XML和XMLList的关系
XML的很多操作最终都是通过XMLList对象来实现的。
XML是一个节点,XMLList是一组节点。
XML的字节点、属性节点在flex中均通过XMLList来描述。
1.2 创建XML/XMLList对象
as支持直接xml语法定义。
var xml:XML = <root><node title="newnode"/></root>;
也可将xml格式的字符串直接转成xml对象
var xml:XML = new XML("<root/>");
xml、xmllist对象均可通过toXMLString()转成格式化的xml字符串。
1.3 向XML节点新增字节点
1.通过appendChild方法,将新节点增加到现有子节点的最后
2.通过insertChildAfter方法,将新节点添加到指定字节点之后;
3.通过insertChildBefore方法,将新节点添加到指定字节点之强。
如:var x:XML = new XML(<r />); //新建一个节点
x.@title = " index is:"+String(xml.children().length()); //为节点添加一个title属性
xml.appendChild( x ); //将新节点添加到当前节点的子节点的最后位置。
1.4 删除子节点
XML节点的删除操作通过 delete 操作符实现,支持按条件删除
1.删除第n个子节点:delete xml.children[n];
2.删除符合条件的子节点: delete xml.children()(@type == “car” && @color == “red”);
xml = <vehicles>
<vehicle type=”car” color=”yellow”/>
<vehicle type=”truck” color=”gray”/>
<vehicle type=” truck” color=” gray”/>
<vehicle type=”car” color=”red”/>
<vehicle type=”car” color=”red”/>
<vehicle type=”car” color=”black”/>
</vehicles>;
3.删除所有字节点:delete xml.*;
4.删除已知子节点node; delete xml.children[node.childIndex()];
1.5 查询子节点
查询属性值符合条件的字节点:var children = xml.children().(@propertyname==”value” ) 可以通过 && () ||进行条件组合
遍历子节点,可递归访问所有字节点。
for each(var child:XML in xml.children()){
child…
}
1.6 访问节点属性
通过@操作符进行属性的读写,如:
xml.@title = “asdfasdf”; Alert.show(xml.@title);
还可以通过[]访问节点属性,如:
xml[“@title”] = “asdfasdfasdf”; Alert.show(xml[“@title”]);
1.7 测试代码(flashbuilder4.5)
<s:NavigatorContent xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
<s:layout>
<s:VerticalLayout paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"/>
</s:layout>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.controls.Alert;
[Bindable]
private var xml:XML = <root>
<r title="package1"/>
<r title="package2"/>
</root>;
[Bindable]
private var xmllist:XMLList = xml.children();
private function appendToXML():void{
var x:XML = new XML(<r title="diagram"/>);
x.@title = "package"+String(xml.children().length());
xml.appendChild( x );
xmltxt.text = xml.toXMLString();
xmllisttext.text = xmllist.toXMLString();
}
private function deleteXMLNode():void{
var x:XML = xml.children()[0];
if( !x ) return;
delete xml.children()[x.childIndex()];
xmltxt.text = xml.toXMLString();
xmllist = xml.children();
xmllisttext.text = xmllist.toXMLString();
xmltxt.text += "\n\n"+ x.toXMLString() +"has be deleted!";
}
private function queryChild():void{
queryResult.text = xml.children().(@title=="package2" || @title=="package3").toXMLString();
}
]]>
</fx:Script>
<s:HGroup verticalAlign="middle">
<s:Label text="XML contant"/>
<s:Button label="append to XML" click="appendToXML()"/>
<s:Button label="delete from 0" click="deleteXMLNode()"/>
<s:Button label="delAllChild" click="delete xml.*; xmltxt.text = xml.toXMLString();"/>
<s:Button label="queryChild" click="queryChild()"/>
</s:HGroup>
<s:TextArea text="{xml.toXMLString()}" id="xmltxt" width="500" height="100%"/>
<s:Label text="XMLList contant"/>
<s:TextArea text="{xmllist.toXMLString()}" id="xmllisttext" width="500" height="100%"/>
<s:Label text="QueryResult"/>
<s:TextArea id="queryResult" width="500" height="100%"/>
</s:NavigatorContent>