新建get_data.xml,放在XAMPP安装目录下的htdocs/RestServer/data/中
get_data.xml
<apps >
<app>
<id>1</id>
<name>Gool Maps</name>
<version>1.0</version>
</app>
<app>
<id>2</id>
<name>Chrome</name>
<version>2.1</version>
</app>
<app>
<id>3</id>
<name>Gool Play</name>
<version>2.3</version>
</app>
</apps>
Pull解析方式
步骤:
1、获取XmlPullParserFactory实例
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
2、得到XmlPullParser对象
XmlPullParser xmlPullParser = factory.newPullParser();
3、调用XmlPullParser的setInput()方法将服务器返回的数据设置进去,解析
xmlPullParser.setInput(new StringReader(responseData));
4、得到当前的解析事件
int eventType = xmlPullParser.getEventType();
MainActivity添加代码
//Pull解析XML
private void parseXMLWithPull(String responseData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(responseData));
//得到当前的解析事件
int eventType = xmlPullParser.getEventType();
String id = null;
String name = null;
String version = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
//开始解析某个节点
case XmlPullParser.START_TAG: {
if ("id".equals(nodeName)) {
//nextText() 获取节点内具体的内容
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)){//完成app节点的解析
Log.e("MainActivity","id is "+id);
Log.e("MainActivity","name is "+name);
Log.e("MainActivity","version is "+version);
}
break;
}
default:
break;
}
//获取下一个解析事件
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果
SAX解析方式
新建ContentHandler类
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
//开始XML解析的时候调用
public void startDocument() throws SAXException {
id = new StringBuilder();
name = new StringBuilder();
version = new StringBuilder();
}
/**
* 开始解析某个节点时候调用
* @param uri
* @param localName 记录当前节点的名字
* @param qName
* @param attributes
* @throws SAXException
*/
@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 {
//根据当前节点名判断将内容添加到哪一个StringBuilder对象中
if ("id".equals(nodeName)) {
//nextText() 获取节点内具体的内容
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)){
//id name version 可能包括回车或换行符 trim()
Log.e("ContentHandler","id is "+id.toString().trim());
Log.e("ContentHandler","name is "+name.toString().trim());
Log.e("ContentHandler","version is "+version.toString().trim());
//将StringBuilder清空,不然会影响下一次内容的读取
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
//完成XML解析的时候调用
public void endDocument() throws SAXException {
super.endDocument();
}
}
MainActivity添加代码
private void parseXMLWithSAX(String responseData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(responseData)));
} catch (Exception e) {
e.printStackTrace();
}
}
运行结果
MainActivity完整代码
public class MainActivity extends AppCompatActivity {
AppCompatTextView responseText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseText = findViewById(R.id.response_text);
AppCompatButton sendRequest = findViewById(R.id.send_request);
responseText = findViewById(R.id.response_text);
sendRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendRequestWithOkHttp("http://192.168.31.65/RestServer/data/get_data.xml");
}
});
}
//OkHttp
private void sendRequestWithOkHttp(final String url) {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
//parseXMLWithPull(responseData);
parseXMLWithSAX(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void parseXMLWithSAX(String responseData) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
ContentHandler handler = new ContentHandler();
//将ContentHandler的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
//开始执行解析
xmlReader.parse(new InputSource(new StringReader(responseData)));
} catch (Exception e) {
e.printStackTrace();
}
}
//HttpURLConnection
private void sendRequestWithHttpURLConnection(final String connectionUrl) {
//开启线程发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(connectionUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream in = connection.getInputStream();
//对获取的输入流进行读取
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
showResponse(response.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
//Pull解析XML
private void parseXMLWithPull(String responseData) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(responseData));
//得到当前的解析事件
int eventType = xmlPullParser.getEventType();
String id = null;
String name = null;
String version = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
String nodeName = xmlPullParser.getName();
switch (eventType) {
//开始解析某个节点
case XmlPullParser.START_TAG: {
if ("id".equals(nodeName)) {
//nextText() 获取节点内具体的内容
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)) {//完成app节点的解析
Log.e("MainActivity", "id is " + id);
Log.e("MainActivity", "name is " + name);
Log.e("MainActivity", "version is " + version);
}
break;
}
default:
break;
}
//获取下一个解析事件
eventType = xmlPullParser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//在这里进行UI操作,将结果显示到界面上
responseText.setText(response);
}
});
}
}