flex操作XML,强力总结帖
http://qiqishou.iteye.com/blog/585908
初始化XML对象
XML对象可以代表一个XML元素、属性、注释、处理指令或文本元素。在ActionScript 3.0中我们可以直接将XML数据赋值给变量:
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>
你也可以使用new 构造器来从XML数据文本创建一个XML对象实例:
var myXML:XML = new XML("<order><item id='1'><menuName>burger</menuName><price>3.95</price></item></order>")
如果XML数据不是格式完好的(如少了结束标签),那么将会出现运行时错误。
注意,你也可以将变量实例传入XML数据中: 使用{}
var tagname:String = "item";
var attributename:String = "id";
var attributevalue:String = 5;
var content:String = "Chicken";
var x:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>;
trace (x.toXMLString())
// Output: <item id="5">Chicken</item>
通常我们的应用是从外部源导入XML数据,如web service或RSS feed,以下是一个从远程URL导入XML数据的例子:
var myXML:XML = new XML();
var XML_URL:String = "http://www.example.com/Sample3.xml";
//创建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:XML = XML(myLoader.data);
trace("Data loaded.");
}
E4X包含一些直观的方法XML数据的操作符(如.和@:用于访问属性):
//获取第1个item的menuName值
trace(myXML.item[0].menuName); // Output: burger
//获取第1个item的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添加新的子节点:
var newItem:XML =
<item id="3">
<menuName>medium cola</menuName>
<price>1.25</price>
</item>
myXML.appendChild(newItem);
当然你也可以使用@和.操作符来更新数据:
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";
访问XML数据
你可以使用.(点号)和..操作符访问XML对象的子节点,使用@操作符访问某一节点的属性。考虑以下XML对象:
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>
对象x.book表示一个包含所有名称为book的子节点的XMLList对象,该XMLList包含两个XML对象(两个book节点)。
对象x..lastName表示一个包含XML树结构下部所有的lastName属性的XMLList对象,该XMList包含两个XML对象(两个LastName属性)。
对象x.book.editor.lastName表示一个包含所有x对象的所有名称为book的子节点的所有名称为editor的子节点的所有lastName节点的XMLList对象,该XMLList只包含一个XML对象(值为"Case"的lastName属性)。
访问父节点和子节点
parent()方法返回XML对象的父节点。
你可以使用子节点列表的顺序索引值来访问特定的子节点,例如,假定某一XML对象x有两个名称为book的子节点,你可以如下访问它们:
//第1个book节点
x.book[0]
//第2个book节点
x.book[1]
要访问孙子节点,我们可以如下直接使用儿子和孙子节点的索引值来访问:
x.book[0].title[0]
不过如果x.book[0]只有一个名称为title的子节点的话,那么可以省略索引:
x.book[0].title
类似的,如果x对象只有一个book子节点,并且该book节点的子节点对象只有一个title对象,那么两个索引值都可以省略:
x.book.title
注意,你也可以使用child()方法,直接使用名称访问特定的子节点:
var x.XML =
<order>
<book>
<title>Dictionary</title>
</book>
</order>
var childName:String = "book";
trace (x.child(childName).title) // Output: Dictionary
访问属性
我们使用使用@操作符访问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个item的id属性值
trace(myXML.item[0].@id);//Output:1
使用属性或元素值过滤XML数据
我们可以使用特定的元素名称和属性值来定位到特定的元素考虑以下XML对象:
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>
以下是正确的访问方法:
//lastName为“McGee”的employee对象,第1个employee节点
x.employee.(lastName == "McGee") // The first 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对象的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语句和for each ... in语句。例如,考虑以下XML对象,myXML和myXML..item XMLList对象(包含两个item XML对象节点的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语句可以让我们遍历XMLList的所有属性名称,实际上就是个节点的索引值:
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语句遍历XMLList的所有节点:
var total2:Number = 0;
for each (var item:XML in myXML..item)
{
total2 += Number(item@quantity) * Number(item.price);
}
使用with语句
我们可以使用with语句,来指明后续的属性和节点值都是基于某一XML对象,前面的for each ... in示例代码,使用with语句的代码如下:
var total:Number = 0;
for each (var item in myXML..item)
{
with (item)
{
//{内的属性和节点对象都是基于item XML对象的,所有不需要使用item.来访问。
total += Number(@quantity) * Number(price);
}
}
trace(total);
增加XML对象
我们可以使用prependChild()方法或者appendChild()方法在XML对象的子节点列表的前面或者最后面添加节点:
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()方法在特定的节点前面活着回后面添加节点:
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>)
注意,我们也可以在构造XML对象的时候使用大括号({和})来引用变量:
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[i]}>
<last>{names[i][0]}</last>
<first>{names[i][1]}</first>
</employee>
x = x.appendChild(newnode)
}
我们也可以使用=操作符来给XML对象节点赋值:
var x:XML =
<employee>
<lastname>Smith</lastname>
</employee>
x.firstname = "Jean";
x.@id = "239";
以上代码将把XML对象X设置成如下:
<employee id="239">
<lastname>Smith</lastname>
<firstname>Jean</firstname>
</employee>
我们也可以使用+和+=操作符来连结XMLList:
var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
xList += <c>test3</c>
删除XML对象
E4X规范中定义有delete和deleteByIndex方法用来删除特定的XML节点,但是在当前版本的ActionScript 3.0实现中,并没有实现这两个方法,所有我们不能直接使用这两个方法,不过我们可以使用遍历XML树,剔除特定的节点,重新构造新的XML对象的方法来删除某一特定节点,以下我们将删除employee的lastname子节点:
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函数有两个参数,第1的参数是被删除节点的父节点,第2的参数是被删除节点的在父节点的子节点列表中索引值。先遍历父节点的索引属性,然后遍历其所有的子节点,跳过我们要删除的节点,然后将它们组合成新的XML对象返回。
如果XML对象非常复杂,数据量必较大的话,以上删除节点的实现方法效率是非常好低,所有正确的选择还是使用E4X定义的删除方法,不过这个功能要等到ActionScript 3.0的下一个测试版本才能够实现。
XML类型转换
我们可以将XML对象和XMLList对象转换为字符串,同样的,我们也可以将字符串转换为XML对象和XMLList对象。顺便,请记住所有的XML属性值、名称和文本值都是字符串。
转换XML和XMLList对象为字符串
XML对象和XMLList对象都有有两个成员方法:toString()和toXMLString()方法。toXMLString()方法返回包含所有标签、属性、命名空间声明和XML对象内容的字符串,对与复杂的XML对象(包含有子元素),toString()方法的效果和toXMLString()方法的效果一样,但是对与简单的XML对象(只包含一个文本元素),toString()方法只返回元素的文本内容:
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
将文本字符串转换为XML对象
我们可以使用new构造方法从字符串创建一个XML对象
var x:XML = new XML('<a>test<b>');
但是如果我们试图将一个非XML或者结构不完整的字符串转换为XML对象,那么将会报运行时错误:
var x:XML = new XML('<a>test'); // Throws an error
flex操作XML,强力总结帖相关推荐
- 【转载】 详细介绍Flex中操作XML
一 在介绍Flex中操作XML之前,首先简单介绍下XML中的基本术语. 元素:XML中拥有开始标签和结束标签的这一块称为"元素" 节点:把XML元素与文本结合起来统称为节 ...
- 使用Dom4j操作XML数据
--------------siwuxie095 dom4j 是一个非常优秀的 Java XML 的 API, 用来读写 XML 文件 和操作 XML 数据 特点:性能优异.功能强大.极端易用 dom ...
- 在C#.net中如何操作XML
在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...
- ActionScript 3操作XML 详解
AS3引入了E4X ,它是根据ECMAScript标准处理XML 数据的全新机制.这使得程序员在程序中无缝地操作XML.在AS3中可以使用XML字面值将XML数据直接写入代码,该字面值将被自动解析. ...
- 我错了,有个叫 SelectSingleNode 的可以操作 xml
我错了,有个叫 SelectSingleNode 的可以操作 xml http://blog.csdn.net/wf520pb/article/details/2644549 ------------ ...
- android xml文件操作类,android操作xml
android操作xml封装后的类,包括创建xml和读xml. public class XmlParserUtil { //创建xml文件 public static void createXmlF ...
- c#操作xml实例 2009-03-13 20:00
在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...
- C#操作XML总结1
C#操作XML总结1 网上很多C#操作XML的文章,但是都是东拼西凑,把简单的问题复杂化,不参考罢了.如若照搬硬套,不但达不到目标,反而浪费时间.原本以前做过操作XML的程序,但是忘了,所以今天下午就 ...
- VC++中操作XML(MFC、SDK)
VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作 ...
最新文章
- oracle学习总结三(bulk collect用法)
- iredmail 邮件服务器搭建
- python hmac_Python实现的HMacMD5加密算法示例
- python3精要(59)-转换
- boost::fusion::erase_key用法的测试程序
- 实现自己的轻量级http调用工具
- 初识MQ--mq常见技术介绍
- Unity3D-C#脚本介绍
- codevs——1044 拦截导弹(序列DP)
- Couldn't Copy Base System 错误处理办法
- 百宝云常用运算符教程
- Mac 清理垃圾工具 Clean My Mac破解版
- Frida-dexdump使用,frida环境配置
- 电信重组:移动圈地联通抢山头 电信干等
- 音乐播放器功能的实现,歌词lrc显示,播放过程中来电
- 高等数学期末总复习DAY18.常数项级数、正项级数、交错级数、绝对收敛
- android app数据电脑,Android APP连接电脑数据库(以SQL Server为例)
- 深潜Kotlin协程(二十一):Flow 生命周期函数
- C语言之strcat函数
- 第2章 Python 分支结构
热门文章
- jira linux 一键安装包下载,JIRA使用教程:使用文件包安装JIRA
- HashSpace:探索无国界社交生态链的价值潜力
- 代码随想录day13|二叉树理论基础、二叉树的递归遍历、二叉树的迭代遍历
- 横扫天下mysql首充修改_横扫天下完整修复商业端(邮件发送+充值后台+物品ID+教程)...
- .NET技术在中国为什么老被人嫌弃
- 丹佛斯变频器现场诊断和故障处理研究
- UNIAPP、微信小程序激励视频、插屏等封装
- 鲁棒最小二乘法的三种优化形式(CVX)
- notes for lxf(四)
- C语言中函数指针数组的初始化和使用