`
noahgenius
  • 浏览: 138049 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

一个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。
分享到:
评论
1 楼 i5land 2008-01-07  
不错,正需要呢,自己写一个还挺不好写。简直雪中送炭

相关推荐

    JAVA_API1.6文档(中文)

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    dexml:python的简单死对象-xml映射器

    dexml:用于Python的简单的Object-XML映射器 让我们面对现实:xml是现代生活中的事实。 我什至可以说它擅长于做什么。 但这并不意味着它很容易使用,也不意味着我们必须喜欢它。 大多数时候,XML只是需要摆脱困境,...

    JavaAPI中文chm文档 part2

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    java api最新7.0

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    [Java参考文档].JDK_API 1.6

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    JavaAPI1.6中文chm文档 part1

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    [Java参考文档]

    java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...

    hibernate 框架详解

    第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. Hibernate配置 2.2.4. 用Ant...

    Java 1.6 API 中文 New

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...

    JDK_1_6 API

    org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对...

    hibernate3.04中文文档.chm

    1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. Hibernate配置 2.2.4....

    Hibernate教程

    1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. Hibernate配置 2.2.4. 用Ant...

    Hibernate参考文档

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库...

    java源码包2

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    hibernate 体系结构与配置 参考文档(html)

    多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库...

    Hibernate 中文 html 帮助文档

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库...

Global site tag (gtag.js) - Google Analytics