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

android上解析.plist配置文件的xml解析器

阅读更多
由于项目要同时对应iphone和android两个平台,需要统一服务器端的配置文件,所以就有了这个xml解析器,用于解析已经做好iphone的配置文件。现在初步测试没有什么问题,不敢独享代码,特贴出来与大家分享,希望发现问题的朋友,不啬赐教。
/**
 * .plist配置文件的解析器
 * 支持array
 * <plist version="1.0">
 *   <array>
 *     <dict>
 *       ...
 *     </dict>
 *     ...
 *   </array>
 * </plist version="1.0">
 * 
 * 支持Map
 * <plist version="1.0">
 * <dict>
 *   <id>key</id>
 *   <array>
 *     <dict>
 *       ...
 *     </dict>
 *     ...
 *   </array>
 *   ...
 * </dict>  
 * </plist version="1.0">
 * 
 * @author chen_weihua
 *
 */
public class PlistHandler extends DefaultHandler {
	private LinkedList<Object> list = new LinkedList<Object>();;
	
	private boolean isRootElement = false;
	
	private boolean keyElementBegin = false;
	
	private String key;
	
	private boolean valueElementBegin = false;
	
	private Object root;
	
	@SuppressWarnings("unchecked")
	public Map getMapResult() {
		return (Map)root;
	}
	
	@SuppressWarnings("unchecked")
	public List getArrayResult() {
		return (List)root;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		if ("plist".equals(localName)) {
			isRootElement = true;
		}
		if ("dict".equals(localName)) {
			if (isRootElement) {
				list.addFirst(new HashMap());
				isRootElement = !isRootElement;
			} else {
				ArrayList parent = (ArrayList)list.get(0);
				list.addFirst(new HashMap());
				parent.add(list.get(0));
			}
		}
		
		if ("key".equals(localName)) {
			keyElementBegin = true;
		}
		if ("true".equals(localName)) {
			HashMap parent = (HashMap)list.get(0);
			parent.put(key, true);
		}
		if ("false".equals(localName)) {
			HashMap parent = (HashMap)list.get(0);
			parent.put(key, false);
		}
		if ("array".equals(localName)) {
			if (isRootElement) {
				ArrayList obj = new ArrayList();
				list.addFirst(obj);
				isRootElement = !isRootElement;
			} else {
				HashMap parent = (HashMap)list.get(0);
				ArrayList obj = new ArrayList();
				list.addFirst(obj);
				parent.put(key, obj);
			}
		}
		if ("string".equals(localName)) {
			valueElementBegin = true;
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (length > 0) {
			if (keyElementBegin) {
				key = new String(ch, start, length);
				//Log.d("AR native", "key:" + key);
			}
			if (valueElementBegin) {
				
				if (HashMap.class.equals(list.get(0).getClass())) {
					HashMap parent = (HashMap)list.get(0);
					String value = new String(ch, start, length);
					parent.put(key, value);
				} else if (ArrayList.class.equals(list.get(0).getClass())) {
					ArrayList parent = (ArrayList)list.get(0);
					String value = new String(ch, start, length);
					parent.add(value);
				}
				//Log.d("AR native", "value:" + value);
			}
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if ("plist".equals(localName)) {
			;
		}
		if ("key".equals(localName)) {
			keyElementBegin = false;
		}
		if ("string".equals(localName)) {
			valueElementBegin = false;
		}
		if ("array".equals(localName)) {
			root = list.removeFirst();
		}
		if ("dict".equals(localName)) {
			root = list.removeFirst();
		}
	}
}
分享到:
评论
3 楼 cwh643 2012-03-27  
April-cz 写道
我想问下,直接就可以用这个去解析一个文件吗?返回值是什么?可不可以给出一个解析的例子给看啊....

		PlistHandler handle = new PlistHandler();
				XmlUtil xml = new XmlUtil(handle);
				xml.prase(new FileInputStream(configFile));
				Map result = handle.getMapResult();

2 楼 cwh643 2012-03-27  
修正了一个小BUG,新代码如下
package com.founder.suzhou.ar.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

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

/**
 * .plist配置文件的解析器
 * 支持array
 * <plist version="1.0">
 *   <array>
 *     <dict>
 *       ...
 *     </dict>
 *     ...
 *   </array>
 * </plist version="1.0">
 * 
 * 支持Map
 * <plist version="1.0">
 * <dict>
 *   <id>key</id>
 *   <array>
 *     <dict>
 *       ...
 *     </dict>
 *     ...
 *   </array>
 *   ...
 * </dict>  
 * </plist version="1.0">
 * 
 * @author chen_weihua
 *
 */
public class PlistHandler extends DefaultHandler {
	private LinkedList<Object> list = new LinkedList<Object>();
	
	private boolean isRootElement = false;
	
	private boolean keyElementBegin = false;
	
	private String key;
	
	private StringBuffer value = new StringBuffer();
	
	private boolean valueElementBegin = false;
	
	private Object root;
	
	@SuppressWarnings("unchecked")
	public Map getMapResult() {
		return (Map)root;
	}
	
	@SuppressWarnings("unchecked")
	public List getArrayResult() {
		return (List)root;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		value = new StringBuffer();
		if ("plist".equals(localName)) {
			isRootElement = true;
		}
		if ("dict".equals(localName)) {
			if (isRootElement) {
				list.addFirst(new HashMap());
				isRootElement = !isRootElement;
			} else {
				ArrayList parent = (ArrayList)list.get(0);
				list.addFirst(new HashMap());
				parent.add(list.get(0));
			}
		}
		
		if ("key".equals(localName)) {
			keyElementBegin = true;
		}
		if ("true".equals(localName)) {
			HashMap parent = (HashMap)list.get(0);
			parent.put(key, true);
		}
		if ("false".equals(localName)) {
			HashMap parent = (HashMap)list.get(0);
			parent.put(key, false);
		}
		if ("array".equals(localName)) {
			if (isRootElement) {
				ArrayList obj = new ArrayList();
				list.addFirst(obj);
				isRootElement = !isRootElement;
			} else {
				HashMap parent = (HashMap)list.get(0);
				ArrayList obj = new ArrayList();
				list.addFirst(obj);
				parent.put(key, obj);
			}
		}
		if ("string".equals(localName)) {
			valueElementBegin = true;
		}
	}

	//@SuppressWarnings("unchecked")
	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		if (length > 0) {
			value.append(ch, start, length);
		}
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if (keyElementBegin) {
			key = value.toString();
			//Log.d("AR native", "key:" + key);
		}
		if (valueElementBegin) {
			
			if (HashMap.class.equals(list.get(0).getClass())) {
				HashMap parent = (HashMap)list.get(0);
				parent.put(key, value.toString());
			} else if (ArrayList.class.equals(list.get(0).getClass())) {
				ArrayList parent = (ArrayList)list.get(0);
				parent.add(value.toString());
			}
			//Log.d("AR native", "value:" + value);
		}
		
		
		
		
		if ("plist".equals(localName)) {
			;
		}
		if ("key".equals(localName)) {
			keyElementBegin = false;
		}
		if ("string".equals(localName)) {
			valueElementBegin = false;
		}
		if ("array".equals(localName)) {
			root = list.removeFirst();
		}
		if ("dict".equals(localName)) {
			root = list.removeFirst();
		}
	}
}
1 楼 April-cz 2012-02-14  
我想问下,直接就可以用这个去解析一个文件吗?返回值是什么?可不可以给出一个解析的例子给看啊....

相关推荐

    Android plist 解析工具类及城市plist文件

    - 自定义解析器:由于Android没有内置的.plist解析库,通常需要自定义解析类,实现XMLPullParser接口,逐行解析XML。 2. **工具类的实现**: - 可以创建一个名为`PlistParser`的工具类,包含静态方法`...

    android 解析ios的城市plist文件 并且弹出对话框

    在Android平台上,解析iOS的.plist文件并展示城市选择对话框是一项跨平台的开发任务。.plist(Property List)是Apple iOS系统中用于存储配置数据、轻量级结构化信息的文件格式,通常包含XML或二进制数据。本文将...

    android 解析ios的plist城市文件 并且弹出对话框 获得城市的code

    总结,Android解析iOS的.plist城市文件并弹出对话框获取城市代码的过程包括:读取.plist文件并转换为XML,使用XMLPull解析器解析XML,构建城市数据结构,展示城市列表,监听用户选择并弹出对话框,以及处理用户在...

    加载plist例子

    在Cocos2dx框架中加载和解析plist文件是一项重要的操作,特别是在处理游戏资源或配置文件时。 首先,我们需要理解`plist`文件的基本结构。Plist是Property List的缩写,它是一种XML或二进制格式的数据存储方式,...

    apk/ipa安装包Java解析工具类

    - **XML解析器**:如DOM、SAX或JAXB,用于解析Android的Manifest.xml和iOS的Info.plist。 - **签名处理**:Java提供JSSE(Java Secure Socket Extension)框架,用于处理数字签名和证书。 4. **使用工具类**: -...

    极光推送Demo

    对于Android,你需要在`build.gradle`文件中添加JPush的依赖库,并同步项目。iOS则需要在Xcode的Podfile中引入JPush的相关库,然后执行`pod install`来安装。 Android集成步骤如下: 1. 在`build.gradle`中添加依赖...

    《疯狂XML讲义(第二版)》10131516

    4. XML解析器: 解析XML文档的工具有DOM(文档对象模型)、SAX(简单API for XML)和StAX(流式API for XML)。DOM一次性加载整个文档到内存,适合小型文档;SAX是事件驱动,只读且不需要全部加载,适合大文档;...

    基于 AList api 开发的 Android 和 iOS 客户端.zip

    1. **Info.plist**:这是 iOS 应用的基本配置文件,包含了应用的元数据,如应用名称、版本号和权限设置。 2. **AppDelegate.swift**(或 .m 对于 Objective-C):应用的委托对象,负责处理应用生命周期中的事件,如...

    城市列表Demo

    5. `Info.plist`: 应用的配置文件,可能包含关于应用的元信息。 6. 其他支持文件,如资源图片、字体等。 通过分析这个Demo,开发者可以学习如何加载Plist文件,解析城市数据,使用UITableView或UICollectionView...

    BarcodeScanner.rar

    2. `AndroidManifest.xml`或`Info.plist`:Android和iOS应用的配置文件,定义了应用的基本属性和权限。 3. `build.gradle`或`Podfile`:构建文件,用于配置构建过程和依赖关系。 4. `README.md`:说明文档,介绍项目...

    百度快速定位locSDK_3.3_Demo.rar

    在压缩包中的“百度快速定位locSDK_3.3_Demo”很可能是一个完整的Android或iOS项目,包含必要的资源文件、配置文件以及示例代码。对于Android,我们可能看到如下的主要文件和组件: 1. AndroidManifest.xml:配置...

    大华最新_(20190312)_Android和iOS播放和网络SDK

    因此,本文将深入解析2019年3月9日版本的大华SDK,探讨如何在Android和iOS平台上进行有效的集成与使用。 首先,对于Android平台,大华的SDK集成过程中,开发者需要注意对默认Gradle配置的修改。Gradle是Android开发...

    省市区三级联动

    2. JSON与XML解析:如果数据文件是以JSON或XML格式存在,就需要用到解析库来读取数据。对于iOS开发,可以使用Foundation框架中的NSJSONSerialization或XMLParser;如果是JavaScript,可以使用JSON.parse()或DOM解析...

    AliPaySDK.rar

    "AliPaySDK"是阿里巴巴为开发者提供的支付宝支付SDK,它包含了Android和iOS平台的支付接口、文档和必要的配置文件。在UE4项目中,我们通常会将这个SDK作为一个插件来引入,以便于管理和更新。 UE4插件系统是一个...

    first_app_native-源码.rar

    对于Android应用,通常包含以下几个关键部分:`AndroidManifest.xml`(应用配置文件),`MainActivity.java`(主活动类),`res`目录(资源文件),`build.gradle`(构建脚本)。对于iOS应用,关键组件有:`Info....

    用于测试WiFi的demo

    6. `Manifest.xml` 或 `Info.plist`: 应用配置文件,包含必要的WiFi相关权限声明。 在实际应用中,开发者会基于这些基本组件构建更复杂的测试场景,例如模拟不同的网络环境,进行压力测试,或者集成到持续集成/持续...

    百度地图定位

    在Android或iOS应用中,开发者通常需要在应用程序的清单文件中配置相应的权限,比如在AndroidManifest.xml中添加访问网络和位置信息的权限。 接下来,我们来详细解析"下载解压后,修改清单文件里面的AK就可以使用...

    极光推送 IM

    这通常在Android Studio或Xcode的项目设置中完成,对于Android,您可以在`AndroidManifest.xml`文件中找到 `&lt;application&gt;` 标签内的`android:package`属性进行更改;对于iOS,则是在`Info.plist`文件中修改`...

    手APP扫描二维码功能

    2. **权限申请**: 对于Android和iOS平台,需要在对应的配置文件中添加访问相机的权限。在AndroidManifest.xml中添加`&lt;uses-permission android:name="android.permission.CAMERA" /&gt;`,在iOS的Info.plist中添加`...

    java开源包101

    [ini4j] 是一个简单的Java类库,用来读写Windows的ini配置文件。同时还包含一个 Java Perferences API 的实现。 拒绝服务测试工具 Port Groper PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的...

Global site tag (gtag.js) - Google Analytics