解析XML数据
其实就是已有的工具使用方法,特别白痴的做法,记住就好了。贵在实际项目中融会贯通
Pull解析方式
private void parseXmlWithPull(String xmlData) {
try {
//创建实例
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
//得到对象
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
//设置xml数据
xmlPullParser.setInput(new StringReader(xmlData));
String id = "";
String name = "";
String verson = "";
//得到当前的解析事件,若不等于1:说明解析工作还没有完成,调用next获取下一个解析事件
int eventType = xmlPullParser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
//拿到当前节点名
String nodeName = xmlPullParser.getName();
switch (eventType) {
//开始解析2
case XmlPullParser.START_TAG:
if ("id".equals(nodeName)) {
//获取节点内容
id = xmlPullParser.nextText();
} else if ("name".equals(nodeName)) {
name = xmlPullParser.nextText();
}else if("verson".equals(nodeName)){
verson=xmlPullParser.nextText();
}
break;
//解析完成3
case XmlPullParser.END_TAG:
if("app".equals(nodeName)){
Log.i(TAG, "parseXmlWithPull: "+"id is"+id);
}
break;
default:
break;
}
eventType=xmlPullParser.next();
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
SAX解析方式
- 先建一个Handler继承DefaultHandler
/**
* git_workspace
*
* @author liyuanli
* @data 2017/10/31
*/
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder verson;
private String TAG="ContentHandler";
/**
* 开始解析xml时调用
* 这里初始化StringBuilder对象
* @throws SAXException
*/
@Override
public void startDocument() throws SAXException {
super.startDocument();
id=new StringBuilder();
name=new StringBuilder();
verson=new StringBuilder();
}
/**
* 完成整个xml解析时调用
* @throws SAXException
*/
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
/**
* 开始解析某个节点是调用
* @param uri
* @param localName
* @param qName
* @param attributes
* @throws SAXException
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
//记录当前节点名
nodeName=localName;
}
/**
* 完成解析某个节点时调用
* @param uri
* @param localName
* @param qName
* @throws SAXException
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if("app".equals(localName)){
Log.i(TAG, "endElement: "+"id is "+id.toString().trim());
//最后要将StirngBuilder清空掉
id.setLength(0);
}
}
/**
* 读取节点内容时调用
* @param ch
* @param start
* @param length
* @throws SAXException
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
//根据当前节点名判断将内容添加到那个StirngBuilder对象中
if ("id".equals(nodeName)){
id.append(ch,start,length);
}else if ("name".equals(nodeName)){
name.append(ch,start,length);
}else if ("verson".equals(nodeName)){
verson.append(ch,start,length);
}
}
}
- 调用Handler解析
private void parseXMLWithSAX(String xmlData){
try {
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
XMLReader xmlReader=saxParserFactory.newSAXParser().getXMLReader();
ContentHandler contentHandler=new ContentHandler();
//将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(contentHandler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}