as3 XML类和XMLList类的区别
一、XML类和XMLList类的区别
AS3.0中,处理XML主要用到两个主类,XML类和XMLList类,这两个类的很多内容是共通的。应该有人会问,XML和XMLList的区别是什么?
XML:表示单个的 XML元素。也就是说,该XML元素中,只有一个最顶级的标签,但可以包含其他子标签。
XMLList:表示一组的XML元素。也就是说,该XML元素中,存在多个同级别的顶级标签。当然每个标签也可以包含其他子标签。
呃,这个定义是我自己下的,能理解不?我举例说明吧。
示例1:XML元素,只包含一个标签,同时也是顶级标签
<Cardcolor>黑桃</Cardcolor>
示例2:XML元素,包含多个标签,但只有1个顶级标签
<root>
<Cardcolor>黑桃</Cardcolor>
<Cardname>决斗</Cardname>
</root>
示例3:XMLList元素,拥有2个同级的顶级标签
<Cardcolor>黑桃</Cardcolor>
<Cardname>决斗</Cardname>
有些时候,某些类的方法返回的是XMLList对象,但该XMLList对象只包含一个XML元素,如上篇中最后一例中的myXML.root.(@id == 2).Cardname。那么此时,该XMLList对象将被视为XML对象。
二、XML的四则运算
四则运算,这个词熟吧,好怀念的读书时代。好吧,跑题了!
可以对XML进行一些常规运算,这些运算方式由于形式简单,因此非常实用。
(1) = 号运算
var myXML:XML =
<card>
<Cardcolor>黑桃</Cardcolor>
</card>
我们先加入语句:
myXML.Cardcolor = "梅花";
trace(myXML.toXMLString());
返回:
<card>
<Cardcolor>梅花</Cardcolor>
</card>
我们接着加入语句:
myXML.Cardname = "决斗"
myXML.@id = 1;
trace(myXML.toXMLString());
返回:
<card id="1">
<Cardcolor>梅花</Cardcolor>
<Cardname>决斗</Cardname>
</card>
(2) + 法运算
var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
trace(xList.toXMLString());
返回:
<a>test1</a>
<b>test2</b>
注意:xList的数据类型为XMLList,如果是XML会报错哦!
我们也可以看到,appendChild()方法其实没什么用。
(3) 括号运算
有关括号运算的方式,其实上一篇中我有提及,但我没有具体的说明,只是介绍了这么个用法。事实上,在XML中,可以使用括号运算来对XML对象进行过滤。
示例:
var myXML:XML =
<card>
<root id = '1' type = 'a'>
<Cardcolor>黑桃</Cardcolor>
<Cardname>决斗</Cardname>
</root>
<root id = '2' type = 'b'>
<Cardcolor>黑桃</Cardcolor>
<Cardname>雌雄双股剑</Cardname>
</root>
</card>
请参看和比较以下表达式:
A、myXML.root.(Cardcolor == "黑桃").Cardname
由于符合该条件的对象有2个,所以返回结果是一个XMLList对象:
<Cardname>决斗</Cardname>
<Cardname>雌雄双股剑</Cardname>
B、myXML.root.(@id == 1).Cardname
由于符合该条件的对象只有1个,虽然是XMLList对象,但视为XML,所以返回:
决斗
C、过滤条件不仅限于等于,例如,下面的表达是也是合法的:
myXML.root.(@id >= 1).Cardname
当使用以上括号运算时,需要特别注意,XML对象的结构需要保持一致。不然如果引用到不一致的部分作为判断,会产生报错!
三、XML类、XMLList类常用方法
其实,这两个类真的很接近,汗!下面的讲解中,我需要用到下面这个XML示例:
示例:
var myXML:XML =
<card>
<root id = '1' type = 'a'>
<Cardcolor>黑桃</Cardcolor>
<Cardname>决斗</Cardname>
</root>
<root type = 'b'>
<Cardcolor>黑桃</Cardcolor>
<Cardname>雌雄双股剑</Cardname>
</root>
</card>
(1) toString() 和 toXMLString()
若XML元素包含复杂元素,两者功能相同。
若XML元素只包含简单内容,两者有区别。toString()只包含内容,toXMLString()包含标签。
如示例中,
trace(myXML.root[0].toString())
trace(myXML.root[0].toXMLString())
两者返回内容相同。
trace(myXML.root[0].Cardcolor.toString()) //返回:黑桃
trace(myXML.root[0].Cardcolor.toXMLString()) //返回:<Cardcolor>黑桃</Cardcolor>
两者返回内容不同。
(2) attribute()、attributes()
在示例中:
myXML.root[0].@id
myXML.root[0].attribute("id")
这两个是等值的
trace(myXML.root[0].@*)
trace(myXML.root[0].attributes())
这两个也是等值的
所以,一般情况下,尽量使用@符号来访问属性比较好。
只有以下这种情况例外。大家注意看,示例中,第一个<root>标签有id属性,而第二个没有,然后我们使用上面讲的括号来过滤时:
第一种方法:
trace(myXML.root.(@id >= 1).Cardname);
结果:报错!因为XML结构不完全一致。
第二种方法:
trace(myXML.root.(attribute("id") >= 1).Cardname);
结果:没有报错!说明用该方法可以去除不一致的XML结构。
(3) child()、children()、elements()
在示例中:
trace(myXML.root[0]);
trace(myXML.child("root")[0]);
这两者是等值的。
但一般,使用child的用处,还是为了循环遍历。用下面的语句,可以获得子项的数目。
myXML.child("root").length();
但比较尴尬的是,如果只是为了这个目的,也可以用下面的语句等值实现:
myXML.children().length();
但上面的两个方法,返回的数量都是所有元素的数量,比如下面的例子:
var xml:XML =
<a>
<b></b>
<c></c>
text
</a>;
trace(xml.children().length()); //返回:3
如果只要返回具有标签的元素,那么需要用到elements()方法。
trace(xml.elements().length()); //返回:2
对三者功能做个总结:
child():返回指定的某个子元素
children():返回子元素的列表
elements():返回具有标签的子元素的列表
(4) 删除XML节点
E4X规范中,定义有delete和deleteByIndex方法,用来删除特定的XML节点。但是在AS3.0中,并没有这两个方法。甚至在帮助文档中,也没有提及如何删除一个XML节点。真不负责任啊!!!
不过,其实是可以实现的,用delete方法。
如示例,我们要删除第二个<root>节点,可以用以下语句:
delete myXML.root[1];
用setChildren()方法,可以重写XML节点,但是会把当前的XML节点全部清除。例如:
myXML.setChildren(<a>test</a>);
trace(myXML.toXMLString());
返回:
<card>
<a>test</a>
</card>
但是setChildren()方法是必须带参数的,不然倒也是一个删除节点的方法。
还有一个replace()方法,也是用于替换的,并且可以指定要替换的内容,我这里不做介绍了,有兴趣的朋友可以参考帮助。
http://blog.csdn.net/z9061/article/details/8022005
as3 XML类和XMLList类的区别的更多相关文章
- 2017.12.20 Java中的 IO/XML学习总结 File类详细
IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...
- C++ 类对象和 指针的区别
C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
- XML转换为对象操作类详解
//XML转换为对象操作类 //一,XML与Object转换类 using System.IO; using System.Runtime.Serialization.Formatters.Binar ...
- XML文件与实体类的互相转换
XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...
- CSS 属性 :before && :after的用法,伪类和伪元素的区别
一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...
- C#中 StringBuilder类 与 String类的区别---(转)
在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...
- Python新式类和旧式类的区别
新式类是为了统一**而在2.2中开始引入的. 代码讲解 上面的例子比较明白的说明了问题. B是定义的新式类.那么输入b的时候,不论是type(b),还是b.__class__都是输出的<clas ...
- debug类和trace类的区别
在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类——debug ...
随机推荐
- 树莓派上搭建NAS
首先可以参考看看 搭建家庭 NAS 服务器有什么好方案?下载做NAS的系统也比较多,如FreeNAS.Openfiler等免费系统,或购买其它收费NAS系统.根据自己的需要从硬件到软件的搭建过程.参 ...
- Tensorflow & Python3 做神经网络(视频教程)
Tensorflow 简介 1.1 科普: 人工神经网络 VS 生物神经网络 1.2 什么是神经网络 (Neural Network) 1.3 神经网络 梯度下降 1.4 科普: 神经网络的黑盒不黑 ...
- Ritchie Lawrence 批处理函数库中英文版
可以到这个网址去看看,如果你是注册用户,还可以下载到bat的很多函数库,具体地址如下: http://www.bathome.net/viewthread.php?tid=3056&extra ...
- mysql 聚簇索引、非聚簇索引的区别
索引分为聚簇索引和非聚簇索引. 以一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻.这本书本身就是一个索引,即"聚簇索引". 如果要找& ...
- Python中的类(classes)
Python的类机制使用尽可能少的新语法和语义将类引入语言.python的类提供了面向对象程序设计语言所有的 标准特性:类继承机制允许有多个基类,一个派生类可以覆盖基类中的任何方法,一个方法可以使用相 ...
- bzoj 4566 [Haoi2016]找相同字符——广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 每个后缀结尾处 ct[ ] = 1 ,按拓扑序 dp 一下就能求出 right 集合的 ...
- POJ3208魔鬼数
题目:http://poj.org/problem?id=3208 与一般的数位dp有点不同的是,没有给出上界,而是要通过值来判断这一位该填什么. 当然是从高位向低位填. 为了知道这一位填下去对答案有 ...
- Angular 4 组件间的通信
一.输入属性(父组件与子组件通信) 1. 创建工程 ng new demo1 2.创建order组件 ng g component order 3. 在order组件里定义输入属性 order组件的h ...
- 一组十六进制的字符串每两个转成对应值的byte
/// <summary> /// 一组十六进制的字符串每两个转成对应值的byte,比如4142 会成 AB对应的byte列表 /// </summary> /// <p ...
- canvas基础一
使用HTML5中<canvas>元素可以在页面中设定一个区域,然后通过JavaScript动态地在这个区域中绘制图形,要在这块画布(canvas)上绘图,需要取得绘图上下文,而取得绘图上下 ...