`
noahgenius
  • 浏览: 140005 次
  • 性别: 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  
不错,正需要呢,自己写一个还挺不好写。简直雪中送炭

相关推荐

    遍历任何xml成为一个对象object的demo

    在编程中,我们通常使用XML解析器将这种结构映射到对象上,使得我们可以像操作普通对象一样操作XML。 在Java中,我们可以使用DOM(Document Object Model)解析器或者SAX(Simple API for XML)解析器来处理XML。...

    Object-XML文件的相互转换分析

    本篇将深入探讨Object-XML转换的相关知识点,并以Spring框架中的Object-XML映射为例进行详细解析。 首先,让我们理解Object-XML转换的基本概念。在Java中,我们将一个对象转换为XML的过程称为对象序列化,反之称为...

    java 解析xml类映射数据库 数据库操作 反射机制 源码

    DOM解析器会将整个XML文档加载到内存中,形成一个树形结构,方便遍历和查找,适合小规模的XML文件。SAX解析器则采用事件驱动模型,逐行读取XML,占用内存少,适合处理大型XML文件。根据项目需求,可以选择合适的解析...

    xml与java对象映射

    - **XStream**:XStream是一个流行的库,可以轻松地将Java对象转换为XML,并将XML反序列化回Java对象。它的语法简洁,易于理解和使用。 - **Castor**:Castor提供了XML到Java对象的映射,支持复杂的数据结构,包括...

    xml object 互转

    它将整个XML文档加载到内存中,形成一个树形结构,允许我们通过节点遍历和操作XML。 - SAX解析:Simple API for XML(SAX)是一种基于事件驱动的解析方式,不将整个文档加载到内存,而是逐个读取元素和属性,适合...

    struts2中的map遍历

    在Struts2中,Map遍历是一个常见的功能,它允许开发者动态地展示或操作存储在Map中的数据。这个功能在处理表单提交、传递参数或者在视图层展示数据时尤为有用。 首先,让我们理解Map遍历的基本概念。Map是一种键值...

    用类来存储XMl 文件的数据-XML文件解析

    2. 创建类结构:根据XML文件的结构,我们可以创建一系列类,每个类代表XML中的一个元素。例如,如果XML文件包含`&lt;person&gt;`元素,我们可以创建一个`Person`类,包含对应于`&lt;name&gt;`、`&lt;age&gt;`等子元素的属性或字段。 `...

    一个关于递归读取xml 并返回到javaBean的小例子

    这个函数会遍历XML树,遇到`person`元素时,创建一个新的`Person`对象,并设置相应的属性。遇到`name`和`age`这样的文本节点时,调用JavaBean的setter方法。 最后,为了从XML文件中获取数据,我们需要创建一个`...

    解析xml,生成java类

    1. DOM解析:DOM(Document Object Model)模型将XML文档视为一个树形结构,通过创建一个内存中的文档对象模型来解析XML。这种方法适合小规模的XML文件,因为会将整个文件加载到内存中。 2. SAX解析:SAX(Simple ...

    javabean和xml互相转换工具类以及jar包

    下面我们将详细探讨如何实现JavaBean到XML以及XML到JavaBean的转换,并介绍一个用于此目的的工具类和相关的jar包。 首先,JavaBean是一种符合特定规范的Java类,它通常具有公共的getter和setter方法,用于封装属性...

    Jquery xml2Json

    总的来说,"Jquery xml2Json"是一个帮助开发者处理XML数据的实用工具,它简化了XML数据在JavaScript环境中的处理流程,提高了开发效率,是前后端交互中一个非常有价值的辅助工具。通过深入理解这个插件的工作原理和...

    XML动态转化为ObjectDemo

    DOM将整个XML文档加载到内存中形成一个树形结构,便于遍历和操作,但对内存消耗较大;而SAX是事件驱动的,逐行读取XML,适用于大文件,内存占用少,但不支持随机访问。 2. **JAXB(Java Architecture for XML ...

    xml解析工具类

    DOM解析器将整个XML文档加载到内存中,形成一个树形结构,方便开发者对整个文档进行遍历和操作。而SAX则是一种事件驱动的解析方式,它逐行读取XML文档,遇到元素、属性等时触发相应的事件,适合处理大型XML文件,...

    xls(xml2003格式)转json

    遍历XML节点时,将数据组织成键值对,存入一个`Object`。 4. **转换为JSON字符串**:使用`JSON.stringify()`方法将AS3的`Object`转换为JSON格式的字符串。然而,AS3标准库并未提供此方法,所以可能需要引入第三方库...

    xml转对象封装的简单与复杂xml的转化写法

    JAXB是Java标准,能够自动将XML映射到Java类,反之亦然。而使用JDOM则需要手动编写解析和构建逻辑,更适合对XML结构有深度控制的情况。 3. **简单XML转换**:描述中提到的`XmlUtil`工具可能是一个简单的XML到对象的...

    一次代码重构之旅-快速读写xml文件工具类封装

    在描述中提到的博客文章“一次代码重构之旅-快速读写xml文件工具类封装”,作者分享了如何通过Java进行XML操作的优化,将原始的XML处理代码整合到一个工具类中,提供简洁易用的API。在阅读该博客文章的过程中,我们...

    xml转换对象

    2. **创建绑定文件**: 编写一个名为`jaxb bindings`的XML文件,用于指定XML元素和属性如何映射到Java类的字段。 3. **生成XML Schema**: 如果需要,可以通过JAXB的`xjc`工具,从Java类生成对应的XML Schema。 4. **...

    xml文件自动转成java对象工具

    2. **生成Java类结构**:根据XSD中的元素和属性,工具自动生成对应的Java类,每个元素变成类的一个字段,属性则作为类的getter和setter方法。 3. **处理复杂类型**:如果XSD中定义了复杂类型,工具会创建相应的Java...

    XML文件解析封装工具类

    1. **DOM解析器(Document Object Model)**:这是最常见的XML解析方式,它将整个XML文档加载到内存中,形成一个树形结构,便于遍历和操作。Java中的`javax.xml.parsers.DocumentBuilderFactory` 和 `org.w3c.dom....

    PB解析XML字符串 把XML 变为数据窗口

    描述中提到“内含源码”,意味着提供了一个示例代码,你可以参考这个源码学习如何在PB中实现XML到数据窗口的转换。这通常会涉及到对XML处理函数的使用,以及数据窗口对象的操作。在学习和使用这些源码时,需要注意...

Global site tag (gtag.js) - Google Analytics