一个as2的类遍历XML并映射到普通Object

一个as2的类遍历XML并映射到普通Object。
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结构
<?xml version="1.0" encoding="utf-8"?>
<slide>
  <item>
    <id>1</id>
    <msg>Windows Live Messenger 2008 est arrivé !</msg>
    <picUrl>images/1.jpg</picUrl>
    <picLink>http://www.google.com</picLink>
    <themeId>0x0099FF</themeId>
  </item>
  <item>
    <id>2</id>
    <msg>Messenger Awards : découvrez le Palmarès</msg>
    <picUrl>images/2.jpg</picUrl>
    <picLink>images/2.jpg</picLink>
    <themeId>0x9900FF</themeId>
  </item>
  <item>
    <id>3</id>
    <msg>Défiez vos amis au foot sur Messenger !</msg>
    <picUrl>images/3.jpg</picUrl>
    <picLink>images/3.jpg</picLink>
    <themeId>0x0099FF</themeId>
  </item>
  <item>
    <id>4</id>
    <msg>Créez votre profil Messenger !</msg>
    <picUrl>images/4.jpg</picUrl>
    <picLink>images/4.jpg</picLink>
    <themeId>0x0099FF</themeId>
  </item>
  <item>
    <id>5</id>
    <msg>5555555</msg>
    <picUrl>images/4.jpg</picUrl>
    <picLink>images/4.jpg</picLink>
    <themeId>0x9900FF</themeId>
  </item>
</slide>

比如我们要访问其中一个node叫Créez votre profil Messenger !
就用 obj["item"][4]["msg"].__value__
如果是访问属性,就用obj["item"][4]["msg"].__attr__。
__value__和__attr__是对象的特殊field,分别代表文字跟属性集合,当然如果某对象没有文本,就没有__value__对象,但是__attr__一定有,只不过是一个空的object。

你可能感兴趣的:(windows,xml,Google,D语言)