`
xiao5233
  • 浏览: 26484 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

android 反射解析xml文件成为java对象

 
阅读更多

ReflectResolveXML.java

package com.player.handle;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Stack;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ReflectResolveXML extends DefaultHandler {
	public static final String T_COLLECTION="collection";
	public static final String T_OBJECT="object";
	public static final String T_LANG="lang";
	private static final String T_DATE = "date";
	private static final String D_PATTERN = "yyyy-MM-dd HH:mm:ss";
	Stack<Object> stack=new Stack<Object>();
	private Object root=null;
	public Object getRoot() {
		return root;
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
	//	System.out.println("endElement:"+uri+" localName:"+localName+ " qName:"+qName);
		if (qName.equals(T_OBJECT)||qName.equals(T_COLLECTION)) {
			//如果集合类或者object类 属性注入完成则需要弹出堆栈
			stack.pop();
		}
	}
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stu
		StringBuffer stb=new StringBuffer();
		for (int i = 0; i < attributes.getLength(); i++) {
			stb.append(attributes.getValue(i)+"---")	;
		}
		System.out.println("startElement:"+uri+" localName:"+localName+ " qName:"+qName+" Attr: "+stb.toString());
		//如果根元素为null  则新建一个 因为第一个读取的必定是根元素
		String type=attributes.getValue("type");
		if (root==null) {
			root=instanceObjectByType(type); 
			stack.push(root);
			return;
		}
		String value=attributes.getValue("value");
		String name=attributes.getValue("name");
		Object pObj=stack.peek();
			//根元素不为空 则根据 qname判断 
			if (qName.equals(T_COLLECTION)||qName.equals(T_OBJECT)) {
				//如果是list则new 一个list 或者 object 则new出来
				Object obj=instanceObjectByType(type);
				stack.push(obj);
				injectToParent(pObj, obj,name);
			}else if (qName.equals(T_LANG)) {
				//如果是lang 则需要转化value值
				Object valueObj=typeConvert(type, value);
				injectToParent(pObj,valueObj,name);
			}else if (qName.equals(T_DATE)) {
				//如果是date
				String pattern=attributes.getValue("pattern");
				if (pattern==null) {
					pattern=D_PATTERN;
				}
				Object valueObj=typeConvertDate(value,pattern);
				injectToParent(pObj,valueObj,name);
			}
	}


	
	//转化date类型
	private Date typeConvertDate( String value, String pattern) {
		SimpleDateFormat sdf=new SimpleDateFormat(pattern);
		Date date;
		try {
			date = sdf.parse(value);
			return date;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	//向上一级元素中注入属性 或者向集合类中add子元素
	private void injectToParent(Object pObj, Object fieldValue ,String fieldName) {
		if (pObj instanceof Collection) {
			//如果上一级是集合类 则需要添加进去
			((Collection) pObj).add(fieldValue);
			return ;
		}
		//如果上一级是object 则需要反射字段赋值
		Field[] fields = pObj.getClass().getDeclaredFields();
		for (Field field : fields) {
			if (field.getName().equals(fieldName)) {
				try {
					field.setAccessible(true);
					field.set(pObj, fieldValue);
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
					e.printStackTrace();
				}
				break;
			}
		}
	}

	//反射实例化对象
	private Object instanceObjectByType(String qName) {
		try {
			Class localClass= Class.forName(qName);
			Object obj=localClass.getConstructor().newInstance();
			return obj; 
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	
	}
	
	// 此方法用于将一个字符串转换为相应的数据类型
	public Object typeConvert(String className, String value) {
		if (className.equals("java.lang.String")) {
			return value;
		} else if (className.equals("java.lang.Integer")) {
			return Integer.valueOf(value);
		} else if (className.equals("java.lang.Long")) {
			return Long.valueOf(value);
		} else if (className.equals("java.lang.Boolean")) {
			return Boolean.valueOf(value);
		} else if (className.equals("java.lang.Float")) {
			return Float.valueOf(value);
		} else if (className.equals("java.lang.Double")) {
			return Double.valueOf(value);
		} else
			return null;
	} 
	
	
}

 reflect.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<collecton type="java.util.ArrayList">
	<object type="com.player.module.Resource">
		<lang type="java.lang.String" name="id" value="0001"></lang>
		<object type="com.player.module.Mp3" name="mp3">
				<lang type="java.lang.String" name="mp3Name" value="天地初开的时候.mp3"></lang>
				<lang type="java.lang.Integer" name="mp3Size" value="12333"></lang>
		</object>
		<object type="com.player.module.Lrc" name="lrc">
				<lang type="java.lang.String" name="lrcName" value="天地初开的时候.lrc"></lang>
				<lang type="java.lang.Integer" name="lrcSize" value="4312"></lang>
		</object>
		<date type="java.util.Date" name="date" value="2001-12-12 12:12:12"></date>
	</object>
	
	<object type="com.player.module.Resource">
		<lang type="java.lang.String" name="id" value="0002"></lang>
		<object type="com.player.module.Mp3" name="mp3">
				<lang type="java.lang.String" name="mp3Name" value="那一曲盛放的玫瑰.mp3"></lang>
				<lang type="java.lang.Integer" name="mp3Size" value="12333"></lang>
		</object>
		<object type="com.player.module.Lrc" name="lrc">
				<lang type="java.lang.String" name="lrcName" value="那一曲盛放的玫瑰.lrc"></lang>
				<lang type="java.lang.Integer" name="lrcSize" value="4312"></lang>
		</object>
		<date type="java.util.Date" name="date" value="2001-12-13 12:12:12"></date>
	</object>
</collecton>

 HandleTest.java

package com.player.handle;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.junit.Test;
import org.xml.sax.SAXException;

import com.player.module.Resource;


public class HandleTest  {
	
	@Test
	public void testresolveXmlTest() throws ParserConfigurationException, SAXException, IOException{
	//	HttpDownloader downloader=new HttpDownloader();
	//	String xml= downloader.download(Mp3ListActiviy.URL);
		File file=new java.io.File("D:\\Soft\\Program\\Apache-Tomcat-6.0.20\\webapps\\android_mp3\\reflect.xml");
		SAXParser saxParser=SAXParserFactory.newInstance().newSAXParser();
		ReflectResolveXML reflectResolveXML=new ReflectResolveXML();
		saxParser.parse(file, reflectResolveXML);
		List<Resource> resources=(List<Resource>) reflectResolveXML.getRoot();
		System.out.println("---------------------");
		for (Resource resource : resources) {
			System.out.println(resource.toString());
		}
		//mp3xmlHandle.getMp3List();
	}
	
	
}

 三个javabean

public class Lrc {
	private String lrcName;
	private Integer lrcSize;
}


public class Mp3 {
	private String mp3Name;
	private int mp3Size;
}

public class Resource {
	private String id;
	private Mp3 mp3;
	private Lrc lrc;
	private Date date;
}
 
2
1
分享到:
评论

相关推荐

    Android 获取系统内存、保存解析xml demo

    在Android开发中,获取系统内存信息以及保存和解析XML文件是常见的操作,这些功能对于优化应用性能、存储数据以及与其他应用或服务器交换信息至关重要。以下将详细介绍这两个知识点,并提供一个简单的示例。 首先,...

    android系统java反射机制详解

    在Android系统中,Java反射机制同样被广泛应用,尤其是在动态加载类、处理不确定类型的对象、调用私有方法或者访问私有变量等方面。下面将深入探讨Java反射机制的概念、原理及在Android开发中的应用。 一、Java反射...

    xml解析和json解析.zip

    - 使用DOM4J解析XML文件,你可以创建一个XML文档,添加元素、属性,甚至执行XPath查询来检索数据。 - 使用Fastjson解析JSON字符串,你可以快速地将JSON转换为Java对象,如Map、List或其他自定义类,反之亦然。 ...

    Android Pull解析Demo

    "Android Pull解析Demo"就是这样一个示例,它展示了如何利用Android系统内置的Pull解析器(PullParser)来解析XML文档,同时结合Java的反射机制,动态地获取类中的变量值。下面我们将深入探讨这两个关键知识点。 **...

    Android开发中解析xml文件XmlUtils工具类与用法示例

    在Android开发中,XML文件常用于存储数据或配置信息,而`XmlUtils`工具类则提供了方便的方法来解析XML文件并将其转换为Java对象。这个工具类不是Android SDK自带的,通常是由开发者自定义实现的,例如提供的示例代码...

    android与web交互

    为了提高软件的灵活性、可扩展性和自适应能力,本文介绍了一种基于Java反射机制的方法,用于解析XML数据,并将其封装为JavaBean对象,以便Android应用程序能够更高效地处理来自Web服务的数据。 #### 二、Java反射...

    xmlPares用户只需填参数就可解析

    这个工具可能提供了一种便利的方式,允许开发者只需提供JavaBean的类名和XML相关参数,即可自动解析XML数据并填充到对应的Java对象中。这种映射过程通常基于Java的反射API,它允许程序在运行时检查类的信息,如方法...

    Java解析apk所需jar包

    要从Java环境中解析APK文件,通常需要特定的工具和库,本话题将详细探讨如何利用Java来解析APK,以及相关的关键知识点。 首先,我们需要理解APK的结构。一个APK文件实际上是一个ZIP格式的压缩包,包含以下几个核心...

    java环境下通过aapt解析apk文件

    将这个库导入到你的Java项目中,可以使用反射等技术调用其内部的方法来读取APK文件的元数据。 以下是一些关键步骤: 1. **读取APK文件**:使用Java的`java.util.zip`包,如`ZipFile`类,打开并遍历APK文件的ZIP...

    android demo,webview_js(webview的js方法调用java方法)。

    `handleJsCall()`方法会解析URL,提取出JavaScript调用的Java方法名和参数,然后执行相应的Java方法。这里需要一个桥梁函数来执行实际的Java操作: ```java private void handleJsCall(String jsUrl) { String ...

    java学习助手_Android简单应用

    Java学习助手是一款面向Java初学者和安卓开发者的应用,它为用户提供了一...通过Java学习助手,用户可以系统地学习和实践这些知识点,逐步提升自己的编程技能,为成为合格的Java程序员或Android开发者打下坚实的基础。

    Java学习路线,Android学习路线,Java全套路线视频下载连接

    - **界面布局**:学习XML布局文件的设计,掌握LinearLayout、RelativeLayout等常见布局。 - **Activity与Fragment**:理解Activity生命周期,学会在不同页面间传递数据。 - **数据存储**:了解SharedPreferences、...

    android_xStream

    其工作原理是通过反射机制来解析和构建对象,使得开发者可以快速地在XML和Java对象之间进行数据交换。 首先,要使用XStream,需要将其引入到Android项目中。在`build.gradle`文件中添加依赖: ```groovy ...

    android 底层代码libcore部分

    DOM解析器提供了一种基于树的数据结构来存储XML文档,而SAX解析器则是事件驱动的,适用于处理大型XML文件。 4. **加密与安全** Libcore包含了Java Cryptography Architecture (JCA) 和 Java Cryptography ...

    AXMLPrinter2官网源码和jar文件

    例如,你可以使用`java -jar AXMLPrinter2.jar your_file.xml &gt; output.txt`这样的命令来解析XML文件。 2. **AXMLPrinter.jar**:这是AXMLPrinter的早期版本,功能与AXMLPrinter2类似,但可能在某些特性或性能上...

    通过Java annotation以及反射机制实现不同类型通用的数据库访问接口

    此外,AndroidManifest.xml是Android应用的重要配置文件,其中包含了应用的基础信息、权限声明、服务、广播接收器等。在数据库访问接口的实现中,我们可能需要在此处声明所需的权限,如读写数据库的权限。而res...

    tangiblexml:使用注释和反射的自动 XML 到对象转换

    TangibleXML 是一个 Android 库,它通过注解和反射自动将 XML 解析为方便的对象。 通过注释的强大功能,它真的很容易使用。 TangibleXML 的灵感来自 Alex Gilleran 的 IceSoap(实际上是它的介绍文档),它对于我...

    Android源码解析

    - LayoutInflater用于根据XML布局文件实例化视图。 - **关键方法**: - `inflate(int resource, ViewGroup root, boolean attachToRoot)`: 加载布局。 - **LocalBroadcastManager源码解析** - ...

Global site tag (gtag.js) - Google Analytics