网络传输数据时最常用的格式有XML和json。首先我们获取XML格式数据时,需要搭建一个服务器,服务器搭建详情请看
https://mp.csdn.net/postedit/88534680
xml有两种解析方式:Pull和SAX
Pull解析方式:
private void sendRequestWithOkHttp(){
//开启线程发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
try {
//创建OkHttpClient对象
OkHttpClient client=new OkHttpClient();
Request request= new Request.Builder()
.url("http://l0.0.2.2/get_data.xml")
.build();
//得到response对象
Response response=client.newCall(request).execute();
//得到返回的内容
String responseData=response.body().string();
parseXMLWithPull(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void parseXMLWithPull(String xmlData) {
try {
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser=factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlData));
int eventType=xmlPullParser.getEventType();
String id="";
String name="";
String version="";
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();
}
}
SAX解析方式:
/**
* SAX方式解析:需要新建类继承自DefaultHandler类,并重写5个方法,如下所示
*/
public class ContentHandler extends DefaultHandler{
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
private StringBuilder text;
//在开始XML解析的时候调用
@Override
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
text = 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)){
version.append(ch, start, length);
}
}
//在对某个节点的解析完成时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("app".equals(localName)){
text.append("id is " + id.toString() + "\n");
text.append("name" + name.toString() + "\n");
text.append("version is " + version.toString() + "\n");
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
//整个XML解析完成的时候调用
@Override
public void endDocument() throws SAXException {
dataText.setText(text);
super.endDocument();
}
}
private void xml_sax(){
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
ContentHandler mHandler = new ContentHandler();
InputStream in = getAssets().open("example.xml");
parser.parse(in,mHandler);
} catch (Exception e) {
e.printStackTrace();
}
}
总结:
优点 | 缺点 | |
SAX |
| 缺点
|
Pull |
| 可扩展性差,无法修改XML树内容结构 |