as2是动态语言,这里发挥它的动态特质,动态构建面向XML节点的对象。
/** * ... * @author Default * @version 0.1 */ class MediaSolutions.xmlspider.ParseXML { private var ONE_PREFIX:String = "---"; public function ParseXML() { } /** * parse XML into one object * @param xmltext * @param traceflag * @return */ public function parse(xmltext:XML,traceflag:Boolean):Object { var obj:Object = parseNode(xmltext.firstChild); if(traceflag) { trace(traceXmlObj(obj,ONE_PREFIX)) } return obj; } private function parseNode(node:XMLNode):Object { var nodeobj:Object = new Object(); nodeobj.__attr__ = node.attributes; var cnode:XMLNode = node.firstChild; while(true) { if(cnode == null) { break; } else if(cnode.nodeType == 3 || cnode.nodeType == 4) { nodeobj.__value__ = cnode.nodeValue; break; } else { var cnodeName:String = cnode.nodeName; if(nodeobj[cnodeName] instanceof Array) { nodeobj[cnodeName].push(parseNode(cnode)); } else if(nodeobj[cnodeName] != null) { var temp:Object = nodeobj[cnodeName]; nodeobj[cnodeName] = new Array(); nodeobj[cnodeName].push(temp); nodeobj[cnodeName].push(parseNode(cnode)); } else { nodeobj[cnodeName] = parseNode(cnode) } cnode = cnode.nextSibling; } } return nodeobj; } /** * trace info * @param xmlobj * @param initlayerPrefix * @return */ private function traceXmlObj(xmlobj:Object, initlayerPrefix:String):String { if(xmlobj.__value__ != null) { return initlayerPrefix + xmlobj.__value__ + "\n"; } else { var s:String = ""; for(var prop in xmlobj) { if(prop != "__value__" && prop != "__attr__") { s += initlayerPrefix+prop+"\n"+traceXmlObj(xmlobj[prop],ONE_PREFIX + initlayerPrefix) } } return s; } } }
通过public function parse(xmltext:XML,traceflag:Boolean):Object方法就能返回一个代表XML的Object,有两个参数:
xmltext:XML -- 一个XML对象(注意要先去掉注释)
traceflag:Boolean -- 是否要trace输出结果,主要用来验证解析是否正确
比如有下面一个XML结构
1 Windows Live Messenger 2008 est arrivé ! images/1.jpg http://www.google.com 0x0099FF 2 Messenger Awards : découvrez le Palmarès images/2.jpg images/2.jpg 0x9900FF 3 Défiez vos amis au foot sur Messenger ! images/3.jpg images/3.jpg 0x0099FF 4 Créez votre profil Messenger ! images/4.jpg images/4.jpg 0x0099FF 5 5555555 images/4.jpg images/4.jpg 0x9900FF
比如我们要访问其中一个node叫Créez votre profil Messenger !
就用 obj["item"][4]["msg"].__value__
如果是访问属性,就用obj["item"][4]["msg"].__attr__。
__value__和__attr__是对象的特殊field,分别代表文字跟属性集合,当然如果某对象没有文本,就没有__value__对象,但是__attr__一定有,只不过是一个空的object。