首先要安装一个Apache
服务器
安装完之后,在Apache\htdocs
目录下,新建一个名为get_data.xml
的文件:
<apps>
<app>
<id>1</id>
<name>Google Maps</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Google Play</name>
<version>2.3</version>
</app>
</apps>
- Pull方式解析XML文件
- 获取一个XmlPullParseFactory的实例
- 借助
XmlPullParseFactory
的实例得到XmlPullParse
对象 - 调用
XmlPullParse
对象的setInput()
方法,将服务器返回的xmlData设置进去,就可以开始解析了- 解析开始:
- 用
XmlPullParse
对象的getEventType()
方法得到当前的解析事件 - 在一个while循环里不断的进行解析,如果当前的解析事件不等于
xmlPullParse.END_DOCUMENT
,说明解析工作没有完成,调用next()方法可以获得后一个解析事件; - 在while循环中,通过
getName()
方法得到当前节点的名字,如果发现当前节点名字等于id,name或version,就调用nextNext()方法来获取当前节点的内容,每当解析完一个app节点后,将获取到的内容打印出来
- 用
- 解析开始:
重写解析数据的方法parseXMLWithPull(String xmlData)
:
private void parseXMLWithPull(String xmlData){
try{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParse = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType = xmlPullParser.getEventType();
String id = "";
String name = "";
String version = "";
while(eventType != XmlPullParser.END_DOCUMENT){
Stirng nodeName = xmlPullParser.getName();
switch(eventType){
//开始解析某个节点
case XmlPullParser.START_TAG:
{
if("id".equals(nodeName))
id=xmlPullParser.nextNext();
else if("name".equals(nodeName))
name = xmlPullParser.nextNext();
else if("version".equals(nodeName))
version = xmlPullParser.nextNext()
break;
}
//完成解析某个节点
case XmlPullParser.END_TAG:{
if("app".equals(nodeName)){
Logd
Logd
Logd
}
break;
}
eventType = xmlPullParser.next();
}
}catch(Exception e){
e.printStackTrace();
}
}
SAX解析方式:
首先新建一个自己的ContentHandler
类继承DefaultHandler
类,并重写父类的5个方法:
1. public void startDocument()
初始化每个StringBuilder
2. public void endDocument()
调用父类的endDocument()方法
3. public void startElement(String uri,String localName,String qNAme,Attributes attributes)
如果当前节点名
4. public void endElement(String uri,String localName,String qName)
分析完一个节点后,打印输出节点内容,并且清空每个StringBuilder的内容
5. public void characters(char[] ch,int start,int length)
根据当前的节点名,获取节点内容,根据节点名判断将内容添加到哪一个StringBuilder中
然后在主活动写一个parseXMLWithSAX
方法:
private void parseXMLWithSAX(Stirng xmlData){
try{
SAXParserFactory factory = SAXParserFActory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//将handler设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(xmlData)));
}catch(Exception e){
e.printStackTrace()
}
}