XML格式统一解析

前端之家收集整理的这篇文章主要介绍了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>


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

@H_301_13@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;
	}

}

猜你在找的XML相关文章