【ActionScript 3学习笔记】XML数据的访问与操作

本文介绍如何使用点号运算符访问XML数据的子元素,利用@符号访问元素属性,以及使用XMLList处理同名子元素。此外,还详细讲解了如何添加、删除节点及其属性,并通过通配符和自定义函数灵活地查询XML数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XML数据的访问:

  • 使用“ . ”点号运算符访问各个层级的子元素;
  • 使用“ @ ”来访问各个元素的属性;
  • 同名的子元素成为一个XMLList对象,是XML对象的一个集合,可以使用数组运算符 [ ] 访问。
代码举例:
var xml:XML = 
	<websites>
		<site name="百度">
			<url>http://www.baidu.com/</url>
		</site>
		<site name="谷歌">
			<url>http://www.google.com.hk/</url>
		</site>
	</websites>
			
trace(xml.site.url[0]);				//输出结果:http://www.baidu.com/
trace(xml.site[0].@name);			//输出结果:百度,作用等同于trace(xml.site.@name[0]);
trace(xml.site is XMLList);			//输出结果:true,因为xml有两个同名为site的子元素,因此xml.site为一个XMLList对象
实际上,在第三个trace()语句中,xml即便只有一个site节点,以xml.site这种访问方式进行访问,AVM2所生成的仍然是XMLList对象而非XML对象。

XML元素及属性的添加与删除:

  • 使用点号运算符“ . ”增加节点
xml.site[0].location = "中国";
trace(xml.site[0]);

/*
 * 输出结果:
 *	<site name="百度">
 *		<url>http://www.baidu.com/</url>
 *		<location>中国</location>
 *	</site>
*/
  • 使用“ @ ”增加节点的属性
xml.site[0].@CEO = "李彦宏";
trace(xml.site[0]);

/*
* 输出结果:
*	<site name="百度" CEO="李彦宏">
*		<url>http://www.baidu.com/</url>
*		<location>中国</location>
*	</site>
*/
  • 使用点号运算符“ . ”删除节点
delete xml.site[0].location;
trace(xml.site[0]);
			
/*
* 输出结果:
*	<site name="百度" CEO="李彦宏">
*		<url>http://www.baidu.com/</url>
*	</site>
*/
  • 使用“ @ ”删除节点的属性
delete xml.site[0].@CEO;
trace(xml.site[0]);

/*
* 输出结果:
*	<site name="百度">
*		<url>http://www.baidu.com/</url>
*	</site>
*/


使用双点号“ .. ”访问当前元素的所有子元素

var xml:XML = 
	<websites>
		<site name="百度">
			<url>http://www.baidu.com/</url>
		</site>
		<site name="谷歌">
			<url>http://www.google.com.hk/</url>
		</site>

		<!-- 额外添加三个url节点 -->
		<url>http://www.oschina.net/</url>
		<url>http://www.9ria.com/</url>
		<url>http://www.youkuaiyun.com/</url>
	</websites>

//使用“..”访问所有名为“url”的子节点,包括不同层级
trace(xml..url);
trace(xml..url is XMLList);

//输出结果:
/*
<url>http://www.baidu.com/</url>
<url>http://www.google.com.hk/</url>
<url>http://www.oschina.net/</url>
<url>http://www.9ria.com/</url>
<url>http://www.youkuaiyun.com/</url>
true
*/
由上面的输出结果可以看出,xml..url返回的是一个包含了xml中所有url节点的XMLList对象。

通配符 * 访问XMLList对象中的所有属性

var xml:XML = 
	<websites>
		<site name="百度" direction="内事问百度">
			<url>http://www.baidu.com/</url>
		</site>
		<site name="谷歌" direction="外事问谷歌">
			<url>http://www.google.com.hk/</url>
		</site>
		<site name="天涯" direction="房事问天涯">
			<url>http://www.tianya.cn/</url>
		</site>
	</websites>

//使用通配符 * 访问xml所有site子节点的所有属性,并生成一个XMLList对象
trace(xml.site.@* is XMLList);
trace(xml.site.@*.toXMLString());

//输出结果:
/*
true
百度
内事问百度
谷歌
外事问谷歌
天涯
房事问天涯
*/


使用表达式制定查找子元素的条件

var xml:XML = 
	<websites>
		<site id="100" name="百度" direction="内事问百度">
			<url>http://www.baidu.com/</url>
			<number>100</number>
		</site>
		<site id="200" name="谷歌" direction="外事问谷歌">
			<url>http://www.google.com.hk/</url>
			<number>200</number>
		</site>
		<site id="300" name="天涯" direction="房事问天涯">
			<url>http://www.tianya.cn/</url>
			<number>300</number>
		</site>
	</websites>

//在xml.site这个XMLList中找出所有符合表达式条件的节点
trace(xml.site.(number>100));
			
//输出结果:
/*
<site id="200" name="谷歌" direction="外事问谷歌">
	<url>http://www.google.com.hk/</url>
	<number>200</number>
</site>
<site id="300" name="天涯" direction="房事问天涯">
	<url>http://www.tianya.cn/</url>
	<number>300</number>
</site>
*/
			
//在xml.site这个XMLList中找出属性id值为100的节点
trace(xml.site.(@id == 100));

//输出结果:
/*
<site id="100" name="百度" direction="内事问百度">
	<url>http://www.baidu.com/</url>
	<number>100</number>
</site>
*/

使用自定义函数搜索XML子元素和属性

上例的trace语句中:trace(xml.site.( 表达式 )),仔细观察可发现表达式实际上返回的是一个Boolean值,因此表达式可被自定义函数所取代,而函数的参数即要参与比对的子元素或属性。依然以上例代码为例,我们尝试以自定义函数的方式进行相同操作:
var xml:XML = 
	<websites>
		<site id="100" name="百度" direction="内事问百度">
			<url>http://www.baidu.com/</url>
			<number>100</number>
		</site>
		<site id="200" name="谷歌" direction="外事问谷歌">
			<url>http://www.google.com.hk/</url>
			<number>200</number>
		</site>
		<site id="300" name="天涯" direction="房事问天涯">
			<url>http://www.tianya.cn/</url>
			<number>300</number>
		</site>
	</websites>

checkNumber.times = 0;		//记录checkNumber方法被调用的次数
checkID.times = 0;			//记录checkID方法被调用的次数
			
trace(xml.site.(checkNumber(number)));
trace("\n=========================================================================\n");
trace(xml.site.(checkID(@id)));
			
//用来检测number子节点的方法
function checkNumber(obj:*):Boolean{
	checkNumber.times ++;
	trace("checkNumber。times = " + checkNumber.times);
	return obj>100 ?  true : false; 
}
			
//用来检测id属性的方法
function checkID(obj:*):Boolean
{
	checkID.times ++;
	trace("checkID.times = "+checkID.times);
	return (obj == 100);
}
		
//输出结果:
/*
checkNumber。times = 1
checkNumber。times = 2
checkNumber。times = 3
<site id="200" name="谷歌" direction="外事问谷歌">
	<url>http://www.google.com.hk/</url>
	<number>200</number>
</site>
<site id="300" name="天涯" direction="房事问天涯">
	<url>http://www.tianya.cn/</url>
	<number>300</number>
</site>

=========================================================================

checkID.times = 1
checkID.times = 2
checkID.times = 3
<site id="100" name="百度" direction="内事问百度">
	<url>http://www.baidu.com/</url>
	<number>100</number>
</site>
*/
由上面的输出结果可以看到,使用自定义函数所获得的结果与上例中完全相同。而两个自定义函数分别被调用了3次,是因为xml.site.length()值为3。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值