首页 > 代码库 > 非常简单的XML解析(SAX解析、pull解析)

非常简单的XML解析(SAX解析、pull解析)

这里只是把解析的数据当日志打出来了   非常简单的xml解析方式
1 package com.example.demo.service; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.xml.parsers.DocumentBuilder; 7 import javax.xml.parsers.DocumentBuilderFactory; 8 import javax.xml.parsers.ParserConfigurationException; 9 import javax.xml.parsers.SAXParser; 10 import javax.xml.parsers.SAXParserFactory; 11 12 import org.w3c.dom.Document; 13 import org.w3c.dom.Node; 14 import org.w3c.dom.NodeList; 15 import org.xml.sax.Attributes; 16 import org.xml.sax.SAXException; 17 import org.xml.sax.helpers.DefaultHandler; 18 import org.xmlpull.v1.XmlPullParser; 19 20 import android.renderscript.Element; 21 import android.util.Log; 22 import android.util.Xml; 23
24 public class PullXMLService { 25 /** 26 * 27 * pull解析 28 * @param is xml输入 29 * @return 30 * @throws Exception 31 */ 32 public String pullParser(InputStream is) throws Exception { 33 34 XmlPullParser parser = Xml.newPullParser(); 35 //设置编码,编码不对解析不出来 36 parser.setInput(is, "GBK"); 37 //接收事件类型 38 int type =parser.getEventType(); 39 //事件类型不为END_DOCUMENT 继续循环 40 while (type!=XmlPullParser.END_DOCUMENT) { 41 switch (type) {//判断事件类型是否开始元素 42 case XmlPullParser.START_TAG: 43 //是开始元素开始有条件的解析 44 if("hunan".equals(parser.getName())){ 45 Log.e("ss", parser.getAttributeValue(0)); 46 }else if("city".equals(parser.getName())){ 47 //取属性,可以下标取,也可以属性名称取 48 Log.e("ss", "城市:"+parser.getAttributeValue(2)+"天气:"+parser.getAttributeValue(8)+"温度:"+parser.getAttributeValue(10)+"-"+parser.getAttributeValue(9)+"实时温度"+parser.getAttributeValue(11)+"风力:"+parser.getAttributeValue(12)+"湿度:"+parser.getAttributeValue(14)+"时间:"+parser.getAttributeValue(15)+""); 49 //取文本 50 String text=parser.nextText(); 51 }else{ 52 } 53 break; 54 } 55 //循环一次更改事件状态 56 type = parser.next(); 57 } 58 return null; 59 60 } 61 /** 62 * SAX方式解析Xml 63 * @param is xml输入 64 * @throws ParserConfigurationException 65 * @throws SAXException 66 * @throws IOException 67 */ 68 public void saxParsar(InputStream is) throws ParserConfigurationException, SAXException, IOException { 69 //创建sax工厂 70 SAXParserFactory sf = SAXParserFactory.newInstance(); 71 //实例化sax 72 SAXParser sp =sf.newSAXParser(); 73 //解析调用 ,具体解析方法在 DHDefaultHandler类 在下面 74 sp.parse(is, new DHDefaultHandler()); 75 76 77 } 78 103 104 } 105 106 /** 107 * SAX解析通过继承DefaultHandler 重写父类方法实现,具体重写什么方法看具体情况 108 * @author huqiang 109 * 110 */ 111 class DHDefaultHandler extends DefaultHandler { 112 113 /** 114 * 开始标签处,可解析处标签属性,具体要解析什么数据自己判断执行,运行顺序 115 * startDocument() → startElement() → characters() → endElement() → endDocument() 116 */ 117 @Override 118 public void startElement(String uri, String localName, String qName, 119 Attributes attributes) throws SAXException { 120 // TODO Auto-generated method stub 121 Log.e("afa", "元素解析开始"); 122 int attrlegth = attributes.getLength(); 123 Log.e("afa"+attrlegth, localName); 124 if("city".equals(qName)){ 125 //如果没有值最好处理下,或者空格 126 Log.e("afa", "城市:"+attributes.getValue(2)+"天气:"+attributes.getValue(8)+"温度:"+attributes.getValue(10)+"-"+attributes.getValue(9)+"实时温度"+attributes.getValue(11)+"风力:"+attributes.getValue(12)+"湿度:"+attributes.getValue(15)+"时间:"+attributes.getValue(16)+""); 127 /*for (int i = 0; i < attrlegth; i++) { 128 String attrVal = attributes.getValue(i); 129 Log.e("afa"+i, attrVal+"===localName="+localName+",qName="+qName); 130 }*/ 131 } 132 } 133 /** 134 * 解析标签包含的文本,具体需要解析什么标签具体判断 135 */ 136 @Override 137 public void characters(char[] ch, int start, int length) 138 throws SAXException { 139 // TODO Auto-generated method stub 140 String str = new String(ch,start,length); 141 Log.e("afa", "解析标签文本"); 142 Log.e("afa", ""+str); 143 super.characters(ch, start, length); 144 } 145 146 @Override 147 public void startDocument() throws SAXException { 148 // TODO Auto-generated method stub 149 150 Log.e("afa", "开始解析"); 151 super.startDocument(); 152 } 153 154 @Override 155 public void endDocument() throws SAXException { 156 // TODO Auto-generated method stub 157 Log.e("afa", "解析结束"); 158 super.endDocument(); 159 } 160 161 @Override 162 public void endElement(String uri, String localName, String qName) 163 throws SAXException { 164 // TODO Auto-generated method stub 165 Log.e("afa", "元素解析结束"); 166 super.endElement(uri, localName, qName); 167 } 168 }
测试类  xml文件放在src目录下面  
package com.example.demo.test; import java.io.InputStream; import com.example.demo.service.PullXMLService; import android.test.AndroidTestCase; public class Test extends AndroidTestCase { public void testPullParser() throws Exception { PullXMLService pull = new PullXMLService(); //pull.pullParser(Test.class.getClassLoader().getResourceAsStream("weather.xml")); pull.saxParsar(Test.class.getClassLoader().getResourceAsStream("weather.xml")); } }