XML格式统一解析

开发过程中,有时需要解析xml格式数据,但本人比较懒,不喜欢第次都写代码去解析不同的xml数据。所以写一个统一的解析方法去解析所有的xml数据。

如解析下面两段xml格式数据用统一的代码去处理:

<query xmlns='http://life.com/protocol/with' node='rooms'>
  <foo/>
  <goo jid='MyJID'/>
  <fun>fun text</fun>
  <item>
    <sub_item>
      <reason>reason text</reason>
      <item02 p='it'/>
    </sub_item>
  </item>
</query>

<message name="room" age="21">
</message>


写一个统一的数据类型存放内容

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

import android.text.TextUtils;

/**
 * 元素
 * @author Davee
 * @since 2014-08-19
 */
public class Element {
	/** 属性 */
	private Map<String, String> properties;
	/** 子元素 */
	private List<Element> subEmelent;
	/** 元素名 */
	private String elementName;
	/** 内容 */
	private String body;
	
	public Element(String elementName) {
		this.elementName = elementName;
	}
	
	public String getElementName() {
		return elementName;
	}
	
	public void setBody(String body) {
		this.body = body;
	}
	
	public String getBody() {
		return body;
	}
	
	public void addProperty(String propertyName, String propertyValue) {
		if (properties == null) {
			properties = new HashMap<String,String>();
		}
		properties.put(propertyName, propertyValue);
	}

	public String getProperty(String propertyName) {
		return properties.get(propertyName);
	}

	public Map<String, String> getProperties() {
		return properties;
	}

	public String removeProperty(String propertyName) {
		return properties.remove(propertyName);
	}

	public void addSubElement(Element subElement) {
		if (this.subEmelent == null) {
			this.subEmelent = new ArrayList<Element>();
		}
		this.subEmelent.add(subElement);
	}

	public List<Element> getSubElements() {
		return subEmelent;
	}

	public boolean removeSubElement(Element subElement) {
		return this.subEmelent.remove(subElement);
	}

	/**
	 * 返回XML格式
	 * @return
	 */
	public String toXml() {
		StringBuilder sb = new StringBuilder("<");
		sb.append(elementName);
		if (properties != null) {
			for (Map.Entry<String, String> entry : properties.entrySet()) {
				sb.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
			}
		}
		if (TextUtils.isEmpty(body) && subEmelent == null) {
			sb.append("/>");
		} else {
			sb.append(">");
			if (!TextUtils.isEmpty(body)) {
				sb.append(body);
			}
			if (subEmelent != null) {
				for (Element elem : subEmelent) {
					sb.append(elem.toXml());
				}
			}
			sb.append("</").append(elementName).append(">");
		}
		return sb.toString();
	}

	/**
	 * 返回Json格式
	 * @return
	 */
	public String toJson() {
		StringBuilder sb = new StringBuilder("{");
		boolean needComma = false;
		if (!TextUtils.isEmpty(elementName)) {
			sb.append("\"element_name\":\"").append(elementName).append("\"");
			needComma = true;
		}
		if (properties != null && properties.size() > 0) {
			if (needComma) sb.append(",");
			sb.append("\"properties\":{");
			needComma = false;
			for (Map.Entry<String, String> entry : properties.entrySet()) {
				if (!needComma) needComma = true;
				else if (needComma) sb.append(",");
				sb.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\"");
			}
			sb.append("}");
		}
		if (!TextUtils.isEmpty(body)) {
			if (needComma) sb.append(",");
			sb.append("\"body=\":\"").append(body).append("\"");
		}
		if (subEmelent != null && subEmelent.size() > 0) {
			if (needComma) sb.append(",");
			sb.append("\"sub_element\":[");
			needComma = false;
			for (Element elem : subEmelent) {
				if (!needComma) needComma = true;
				else if (needComma) sb.append(",");
				sb.append(elem.toString());
			}
			sb.append("]");
		}
		sb.append("}");
		return sb.toString();
	}

	@Override
	public String toString() {
		return toXml();
	}
}

再写处理方法

import java.io.StringReader;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.SparseArray;

public class XmlParser {
	
	private static SparseArray<Element> cache = new SparseArray<Element>();

	public static Element parse(String xmlStr) {
		Element rootElement = null;
		StringReader input = null;
		try {
			XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
	        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
	        input = new StringReader(xmlStr);
	        parser.setInput(input);

	        int eventType = parser.getEventType();
	        while(eventType != XmlPullParser.END_DOCUMENT) {
	        	boolean hasNext = false;
	        	if (eventType == XmlPullParser.START_TAG) {
	        		int curDepth = parser.getDepth();
	        		Element curElement = new Element(parser.getName());
	        		//设置元素属性
	        		for (int i=0; i<parser.getAttributeCount(); i++) {
	        			curElement.addProperty(parser.getAttributeName(i), parser.getAttributeValue(i));
	        		}
	        		if (!parser.isEmptyElementTag()) {
	                    eventType = parser.next();
	                    if (eventType == XmlPullParser.TEXT) {
	                    	//设置元素内容
	                    	curElement.setBody(parser.getText());
	                    } else if (eventType == XmlPullParser.START_TAG) {
	                    	hasNext = true;
	                    }
	                }

	        		if (rootElement == null) {
	        			rootElement = curElement;

	        			cache.put(curDepth, curElement);
	        		}
	        		else {
	        			cache.put(curDepth, curElement);

	        			Element parentElement = cache.get(curDepth - 1);
	        			if (parentElement != null) parentElement.addSubElement(curElement);
	        		}
	        	}
	        	if (!hasNext) eventType = parser.next();
	        }
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			if (input != null) {
				input.close();
			}
			cache.clear();
		}
		return rootElement;
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值