Android 常见的几种解析XML 的三种方式(Dom SAX pull) 那么这三种方式也有着他们的区别
常规在pc端开发我们使用Dom相对轻松些,因为Dom是基于树形结构的节点或信息片段,允许开发人员使用Dom API遍历XML树,检索所需数据。分析该结构通常需要接在整个文档和构造树形结构,然后才可以检索和更新节点。但是对于特别大的文档解析和加载整个文档会很耗支援。
而SAX解析器是一种基于事件的解析器,它的读取是单向的它的核心是事件处理模式 解析完完后不占内存空间,解析属性方便,但缺点就是对于嵌套多个分支来说处理不是很方便,而Dom方式会把整个XML加载到内存中去, Pull解析器和SAX类似都是基于事件的模式
Pul解析器小巧轻便解析速度快简单易用非常适合在Android移动设备中使用但Pull也常常用在J2ME对于节点处理比较好,类似SAX同样很节省内存在J2ME中我们经常使用的KXML库来解析
下面就用了三种方式来解析自己写的一个person.x
开始我是先做好了网络环境的配置 先启动tomcat 在拿到你的无线局域网的IP地址 (这时你的电脑和你的手机或者是模拟器必须连得是同一个无线局域网)
这样就可以在浏览器上拿到我们XML
然后开始进行代码部分了 对了还要在嵌套文件配置网络的权限
<!--网络权限--> <uses-permission android:name="android.permission.INTERNET"></uses-permission>
public void parseXML(View view){
new MyTask().execute();
}
//线程间通信机制
//子线程+Handler
//异步任务类 AsyncTask
class MyTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
//01.获取网络XML数据
//原生态底层:
//URLConnection
try {
URL url=new URL("http://192.168.43.135/persons.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式‘
connection.setRequestMethod("GET");
//设置请求连接超时的时间(优化)
connection.setConnectTimeout(5000);
//获取结果码
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);
}
获取网络数据并且打印
开始我们的Dom 解析
//01.使用DOM解析
DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
Document document=documentBuilder.parse(is);
//获取跟标签
Element root=document.getDocumentElement();
Log.i("test","跟标签:"+root.getNodeName());
//获取<persons>下面的所有的子标签<person>
NodeList nodeList=root.getElementsByTagName("person");
for (int i = 0; i <nodeList.getLength() ; i++) {
//获取单个
//Node
//Element
Element personElement= (Element) nodeList.item(i);
//获取<person>属性id的值
String id=personElement.getAttribute("id");
Log.i("test",id);
//获取<person>下面的子标签<name><age><image>的值
Element nameElement= (Element) personElement.getElementsByTagName("name").item(0);
String name=nameElement.getTextContent();
Element ageElement= (Element) personElement.getElementsByTagName("age").item(0);
String age=ageElement.getTextContent();
Element imageElement= (Element) personElement.getElementsByTagName("image").item(0);
String image=imageElement.getTextContent();
Log.i("test",name+" "+age+" "+image);
}
SAX解析
//02.SAX(边读边解析,基于事件(方法)驱动方式)
SAXParserFactory saxParserFactory=SAXParserFactory.newInstance();
SAXParser saxParser=saxParserFactory.newSAXParser();
saxParser.parse(is,new DefaultHandler(){
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
@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)){
//获取<name>的值
String name=new String(ch,start,length);
Log.i("test", " "+name);
}else if("age".equals(cuurentTag)){
//获取<name>的值
String age=new String(ch,start,length);
Log.i("test", " "+age);
}else if("image".equals(cuurentTag)){
//获取<name>的值
String image=new String(ch,start,length);
Log.i("test", " "+image);
}
}
});
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 starttagName=xmlPullParser.getName(); if("person".equals(starttagName)){ //获取id的值 String id=xmlPullParser.getAttributeValue(0); Log.i("test",id); }else if("name".equals(starttagName)){ String name=xmlPullParser.nextText(); Log.i("test",name); }else if("age".equals(starttagName)){ String age=xmlPullParser.nextText(); Log.i("test",age); }else if("image".equals(starttagName)){ String image=xmlPullParser.nextText(); Log.i("test",image); } break; case XmlPullParser.END_TAG: break; } //细节: type=xmlPullParser.next(); } } //结果码(状态) //成功:200 // //未修改:304 } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } // catch (ParserConfigurationException e) { // e.printStackTrace(); // } catch (SAXException e) { // e.printStackTrace(); // } // catch (ParserConfigurationException e) { // e.printStackTrace(); // } catch (SAXException e) { // e.printStackTrace(); // }
@Override protected void onPostExecute(Object o) { super.onPostExecute(o); //展示 } }
return null; }