一个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。
分享到:
相关推荐
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
dexml:用于Python的简单的Object-XML映射器 让我们面对现实:xml是现代生活中的事实。 我什至可以说它擅长于做什么。 但这并不意味着它很容易使用,也不意味着我们必须喜欢它。 大多数时候,XML只是需要摆脱困境,...
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
java.sql 提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。 java.text 提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。 java.text.spi java.text ...
第一个持久化类 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...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对 ...
org.omg.CORBA 提供 OMG CORBA API 到 JavaTM 编程语言的映射,包括 ORB 类,如果已实现该类,则程序员可以使用此类作为全功能对象请求代理(Object Request Broker,ORB)。 org.omg.CORBA_2_3 CORBA_2_3 包定义对...
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....
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...
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. 辅助数据库...
6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...
多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库...
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. 辅助数据库...