XML和XMLSocket(二)
一、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()方法,也是用于替换的,并且可以指定要替换的内容,我这里不做介绍了,有兴趣的朋友可以参考帮助。
通过这两篇的介绍,我把AS3.0中,处理XML的方式讲了个大概。我讲的并不完整,包括XML的处理指令啊、命名空间啊等等都没讲,主要还是觉得,一般情况下用不上。如果大家有兴趣,那可以深入了解下。但我是感觉不了解问题也不大,哈哈。 熟悉了这两篇(要真的是熟悉啊)后,相信你对XML的处理也已经游刃有余了。在下面的篇幅中,我将正式开始讲解XMLSocket类了。 本文出自 “寂寞风之谷” 博客,请务必保留此出处http://www.52php.cn/article/p-vlfrapjm-ed.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |