XML和XMLSocket(二) -- 更深的了解AS3.0中的XML

      一、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()方法,也是用于替换的,并且可以指定要替换的内容,我这里不做介绍了,有兴趣的朋友可以参考帮助。

 

      通过这两篇的介绍,我把AS3.0中,处理XML的方式讲了个大概。我讲的并不完整,包括XML的处理指令啊、命名空间啊等等都没讲,主要还是觉得,一般情况下用不上。如果大家有兴趣,那可以深入了解下。但我是感觉不了解问题也不大,哈哈。

      熟悉了这两篇(要真的是熟悉啊)后,相信你对XML的处理也已经游刃有余了。在下面的篇幅中,我将正式开始讲解XMLSocket类了。

你可能感兴趣的:(xml,职场,AS,休闲,XMLSocket)