解析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();
}
}