一、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 &gt;= 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 &gt;= 1).Cardname);

结果:报错!因为XML结构不完全一致。

第二种方法:

trace(myXML.root.(attribute("id") &gt;= 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类的区别的更多相关文章

  1. 2017.12.20 Java中的 IO/XML学习总结 File类详细

    IO / XML 一.File类 1.定义/概念 Java是面向对象的语言,要想把数据存到文件中,就必须要有一个对象表示这个文件.File类的作用就是代表一个特定的文件或目录,并提供了若干方法对这些文 ...

  2. C++ 类对象和 指针的区别

    C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...

  3. C#读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

  4. XML转换为对象操作类详解

    //XML转换为对象操作类 //一,XML与Object转换类 using System.IO; using System.Runtime.Serialization.Formatters.Binar ...

  5. XML文件与实体类的互相转换

    XML文件与实体类的互相转换 一.将XML文件反序列化为实体类对象 1. 通常程序的配置信息都保存在程序或者网站的专门的配置文件中(App.config/web.config).但是现在为了演示XML ...

  6. CSS 属性 :before && :after的用法,伪类和伪元素的区别

    一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...

  7. C#中 StringBuilder类 与 String类的区别---(转)

      在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...

  8. Python新式类和旧式类的区别

    新式类是为了统一**而在2.2中开始引入的. 代码讲解 上面的例子比较明白的说明了问题. B是定义的新式类.那么输入b的时候,不论是type(b),还是b.__class__都是输出的<clas ...

  9. debug类和trace类的区别

    在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类——debug ...

随机推荐

  1. 转oracle 学习- 数据类型

    oracle数据类型 有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维护大有裨益.个人总结了一些Oracle数据类型集解,相信读者阅读了本文以后,Oracle数据库开发起来会事半 ...

  2. MySQL · 特性分析 · 优化器 MRR & BKA【转】

    MySQL · 特性分析 · 优化器 MRR & BKA 上一篇文章咱们对 ICP 进行了一次全面的分析,本篇文章小编继续为大家分析优化器的另外两个选项: MRR & batched_ ...

  3. sql server 阻塞与锁

    SQL Server阻塞与锁 在讨论阻塞与加锁之前,需要先理解一些核心概念:并发性.事务.隔离级别.阻塞锁及死锁. 并发性是指多个进程在相同时间访问或者更改共享数据的能力.一般情况而言,一个系统在互不 ...

  4. Postman 常用测试结果验证及使用技巧

    Postman的test本质上是JavaScript代码,通过我们编写测试代码,每一个tests返回True,或是False.每一个tests实际上就是一个测试用例 官方文档给出了很多验证方式,我们通 ...

  5. tomcat源码阅读之Catalina和Bootstrap解析

    一.Cataling类分析: 1.Catalina类是启动类,用于启动或者关闭Server对象,它包含一个Digester对象,用于解析tomcat配置文件:conf/server.xml;调用pro ...

  6. 【RAC】使用一条“ps”命令获取Linux环境下全部RAC集群进程信息

    如何仅使用一条ps命令便能获取到所有与RAC集群进程相关的信息.  从所使用的命令角度上看很简单,仅需使用ps命令结合grep命令便能实现.问题关键是需要确定检索哪些关键字. 1.与RAC集群有关的进 ...

  7. C# ObjectArx AutoCAD二次开发(转帖)

    http://www.cnblogs.com/houlinbo/p/3325898.html 1.开发基本资料准备 用Vs2010进行Autocad 2010开发,首先下载ObjectArx 2010 ...

  8. golang 如何查看程序执行消耗时间

    写代码过程中,有时需要分析代码块的时间消耗. 本文介绍使用time包中的Since函数查看程序执行时间. package main import ( "fmt" "tim ...

  9. 启动servlet报错:The servlets named [DemoServlet] and [main.java.com.wlf.demo.servlet.DemoServlet] are both mapped to the url-pattern [/hello] which is not permitted

    先看具体错误日志: [2019-04-26 09:29:25,484] Artifact demo-servlet:war: Artifact is being deployed, please wa ...

  10. 添加BAUD_4800

    1.hal_uart.h 添加 #define HAL_UART_BR_4800 0x05 2.mt_uart.h 修改 #define MT_UART_DEFAULT_BAUDRATE HAL_UA ...