網絡下載的數據主要有兩種格式XML和JSON,但是這兩種數據格式都有自己的格式符,解析數據就是從這兩種格式的數據中取出我們需要的數據,去掉格式符。本文記錄了兩種常用XML解析方法:
JSON數據解析方法:http://blog.csdn.net/q296264785/article/details/53909442
XML數據解析常用方法之PULL解析方法:
private void XMLWithPull(String xmlData){//XML數據解析 pull方式
try {
//1、獲得一個XmlPullParserFactory實例
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
//2、通過XmlPullParserFactory實例得到XmlPullParser對象
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
//3、加載需要解析的數據
xmlPullParser.setInput(new StringReader(xmlData));r
//得到當前解析事件
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
//如果解析事件不等於END_DOCUMENT,說明解析還沒完成,需要繼續解析
while(eventType != XmlPullParser.END_DOCUMENT){
//獲得當前解析節點的名字
String nodeName = xmlPullParser.getName();
switch (eventType){
case XmlPullParser.START_TAG:
if("id".equals(nodeName)){
id = xmlPullParser.nextText();//獲取節點的內容並且賦值到對應變量
}else if("name".equals(nodeName)){
name = xmlPullParser.nextText();
}else if("version".equals(nodeName)){
version = xmlPullParser.nextText();
}
break;
//解析完一個節點後將數據輸出
case XmlPullParser.END_TAG:
if("app".equals(nodeName)){
Log.d("MainActivity", "id is " + id);
Log.d("MainActivity", "name is " + name);
Log.d("MainActivity", "version is " + version);
}
break;
default:break;
}
//切換到下一個節點
eventType = xmlPullParser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
XML數據解析常用方法之SAX解析方法:
SAX解析方法需要實現一個DefaultHandler 的子類並且重寫相關的方法。方法的作用可以對應PULL解析理解。
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
public void startDocument() throws SAXException {//開始解析XML的時候調用
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {//開始解析某個節點的時候調用
nodeName = localName;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {//獲取節點中內容的時候調用
if("id".equals(nodeName)){
id.append(ch, start, length);
}else if("name".equals(nodeName)){
name.append(ch, start, length);
}else if("version".equals(nodeName)){
name.append(ch, start, length);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {//完成某個節點的時候調用
if("app".equals(localName)){
Log.d("MainActivity", "id is " + id.toString().trim());
Log.d("MainActivity", "name is " + name.toString().trim());
Log.d("MainActivity", "version is " + version.toString().trim());
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
public void endDocument() throws SAXException {//完成整個解析的時候調用
super.endDocument();
}
}
實例化DefaultHandler 子類,通過相關方法賦值解析數據。
private void XMLWithSAX(String xmlData){
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler contentHandler = new ContentHandler();
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();
}
}
解析的XML目標數據:
<apps>
<app>
<id>1</id>
<name>aa</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Hello</name>
<version>1.2</version>
</app>
<app>
<id>3</id>
<name>bb</name>
<version>1.8</version>
</app>
</apps>