下面分别介绍三种解析方式。
第一种:DOM解析
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,
就可以把Node节点转换成相应节点对象(Node的子类对象),以便于调用其特有的方法。
Node对象提供了相应的方法去获得它的父结点或子结点。
编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容.
缺点: 一次性的完全加载整个xml文件,需要消耗大量的内存。
首先先获取网络XML数据:
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] params) {
//获取网络XML数据 //解析XML//展示
//原生态底层:URLConnction
try {
URL url=new URL("http://192.168.1.110:8080/person.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//设置连接超时的时间(优化)
connection.setConnectTimeout(5000);
//结果码(状态)//成功200 失败 未修改304
//获取结果码
int code=connection.getResponseCode();
if(code==200){
//获取服务器返回来额结果
InputStream is=connection.getInputStream();
//打印(读)
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String str=null;
while ((str=br.readLine())!=null){
Log.i("test",str);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
获取数据成功,打印信息如下:
02-16 12:43:14.602 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.602 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.603 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.604 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.605 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.606 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.607 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.608 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.609 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.610 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.611 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.612 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.613 18236-18298/com.pxd.parsexml I/test:
02-16 12:43:14.615 18236-18298/com.pxd.parsexml I/test:
Dom解析代码如下:
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] params) {
//获取网络XML数据
try {
URL url=new URL("http://192.168.1.110:8080/person.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//设置连接超时的时间(优化)
connection.setConnectTimeout(5000);
//结果码(状态)//成功200 失败 未修改304
//获取结果码
int code=connection.getResponseCode();
if(code==200){
//获取服务器返回来额结果
InputStream is=connection.getInputStream();
//解析XMLDOM解析=====================================
DocumentBuilderFactory documentBuilderFactory= DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();
Document document= documentBuilder.parse(is);
//获取根标签
Element element=document.getDocumentElement();
Log.i("test","根标签:"+element.getNodeName());
NodeList nodeList=element.getElementsByTagName("person");
for (int i = 0; i < nodeList.getLength(); i++) {
//获取单个
Element personElement= (Element) nodeList.item(i);
//获取
String id= personElement.getAttribute("id");
Log.i("test",id);
//获取
Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);
String name= nameElement.getTextContent();
Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);
String age=ageElement.getTextContent();
Log.i("test",name+" "+age);
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (SAXException e) {
e.printStackTrace();
}catch (ParserConfigurationException e) {
e.printStackTrace();
}
return null;
}
这里没有写展示页面,直接打印信息:
第二种SAX解析:
SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
Sax解析代码如下
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] params) {
//获取网络XML数据
try {
URL url=new URL("http://192.168.1.110:8080/person.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//设置连接超时的时间(优化)
connection.setConnectTimeout(5000);
//结果码(状态)//成功200 失败 未修改304
//获取结果码
int code=connection.getResponseCode();
if(code==200){
//获取服务器返回来额结果
InputStream is=connection.getInputStream();
//解析XMLSax解析=====================================
//(边读边解析)
SAXParserFactory saxParseFactory=SAXParserFactory.newInstance();
SAXParser saxParse= saxParseFactory.newSAXParser();
saxParse.parse(is,new DefaultHandler(){
@Override
public void startDocument() throws SAXException {
super.startDocument();
Log.i("test","开始文档");
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
Log.i("test","结束文档");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
cuurentTag=localName;
//获取开始标签的名字
if("person".equals(localName)){
//取属性的值
String id=attributes.getValue(0);
Log.i("test",id);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
cuurentTag=null;
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if("name".equals(cuurentTag)){
//获取
String name=new String(ch,start,length);
Log.i("test", " "+name);
}else if("age".equals(cuurentTag)){
//获取
String age=new String(ch,start,length);
Log.i("test", " "+age);
}
}
});
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return null;
}
效果图:
第三种PULL解析(类似SAX)
代码如下:
//异步任务类AsyncTask
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] params) {
//获取网络XML数据
try {
URL url=new URL("http://192.168.1.110:8080/person.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式
connection.setRequestMethod("GET");
//设置连接超时的时间(优化)
connection.setConnectTimeout(5000);
//结果码(状态)//成功200 失败 未修改304
//获取结果码
int code=connection.getResponseCode();
if(code==200){
//获取服务器返回来额结果
InputStream is=connection.getInputStream();
//使用PULL解析
XmlPullParser xmlPullParser= Xml.newPullParser();
xmlPullParser.setInput(is,"UTF-8");
//获取解析的标签的类型
int type=xmlPullParser.getEventType();
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
//获取开始标签的名字
String starttgname = xmlPullParser.getName();
if ("person".equals(starttgname)) {
//获取id的值
String id = xmlPullParser.getAttributeValue(0);
Log.i("test", id);
} else if ("name".equals(starttgname)) {
String name = xmlPullParser.nextText();
Log.i("test", name);
} else if ("age".equals(starttgname)) {
String age = xmlPullParser.nextText();
Log.i("test", age);
}
break;
case XmlPullParser.END_TAG:
break;
}//细节:
type=xmlPullParser.next();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}catch (XmlPullParserException e) {
e.printStackTrace();
}
return null;
}
打印信息如下:
---------------------
版权声明:本文为CSDN博主「d_shadow」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/d_shadow/article/details/55253586