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

时间:2021-11-30 14:19:03
这里只是把解析的数据当日志打出来了   非常简单的xml解析方式
package com.example.demo.service; import java.io.IOException;
import java.io.InputStream; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import org.xmlpull.v1.XmlPullParser; import android.renderscript.Element;
import android.util.Log;
import android.util.Xml;

public class PullXMLService {
/**
*
* pull解析
* @param is xml输入
* @return
* @throws Exception
*/
public String pullParser(InputStream is) throws Exception { XmlPullParser parser = Xml.newPullParser();
//设置编码,编码不对解析不出来
parser.setInput(is, "GBK");
//接收事件类型
int type =parser.getEventType();
//事件类型不为END_DOCUMENT 继续循环
while (type!=XmlPullParser.END_DOCUMENT) {
switch (type) {//判断事件类型是否开始元素
case XmlPullParser.START_TAG:
//是开始元素开始有条件的解析
if("hunan".equals(parser.getName())){
Log.e("ss", parser.getAttributeValue(0));
}else if("city".equals(parser.getName())){
//取属性,可以下标取,也可以属性名称取
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)+"");
//取文本
String text=parser.nextText();
}else{
}
break;
}
//循环一次更改事件状态
type = parser.next();
}
return null; }
/**
* SAX方式解析Xml
* @param is xml输入
* @throws ParserConfigurationException
* @throws SAXException
* @throws IOException
*/
public void saxParsar(InputStream is) throws ParserConfigurationException, SAXException, IOException {
//创建sax工厂
SAXParserFactory sf = SAXParserFactory.newInstance();
//实例化sax
SAXParser sp =sf.newSAXParser();
//解析调用 ,具体解析方法在 DHDefaultHandler类 在下面
sp.parse(is, new DHDefaultHandler()); } } /**
* SAX解析通过继承DefaultHandler 重写父类方法实现,具体重写什么方法看具体情况
* @author huqiang
*
*/
class DHDefaultHandler extends DefaultHandler { /**
* 开始标签处,可解析处标签属性,具体要解析什么数据自己判断执行,运行顺序
* startDocument() → startElement() → characters() → endElement() → endDocument()
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
Log.e("afa", "元素解析开始");
int attrlegth = attributes.getLength();
Log.e("afa"+attrlegth, localName);
if("city".equals(qName)){
//如果没有值最好处理下,或者空格
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)+"");
/*for (int i = 0; i < attrlegth; i++) {
String attrVal = attributes.getValue(i);
Log.e("afa"+i, attrVal+"===localName="+localName+",qName="+qName);
}*/
}
}
/**
* 解析标签包含的文本,具体需要解析什么标签具体判断
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String str = new String(ch,start,length);
Log.e("afa", "解析标签文本");
Log.e("afa", ""+str);
super.characters(ch, start, length);
} @Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub Log.e("afa", "开始解析");
super.startDocument();
} @Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
Log.e("afa", "解析结束");
super.endDocument();
} @Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// TODO Auto-generated method stub
Log.e("afa", "元素解析结束");
super.endElement(uri, localName, qName);
}
}
测试类  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")); } }