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.csdn.net/</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.csdn.net/</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。