Android端与服务器端交互主要依靠XML预Json,所以解析XML与Json是Android程序员必备的的技能。
解析XML主要有三种方法:
1.DOM解析
DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树、检索所需数据。分析该结构通常需要加载整个文档和构造树形结构,
然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。
2.SAX解析
SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。当事件源产生事件后,
调用事件处理器相 应的处理方法,一个事件就可以得到处理。在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,
这样事件处理器才能够根据提供的事件信 息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。非常适合在Android移动设备中使用。
3.Pull解析
PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,
而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,
Android系统内部在解析各种XML时也是用PULL解析器
首先新建Activity与布局。布局的代码为
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_parse_xml"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.myapplication.ParseXmlActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="parseXML"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/application"
/>
</LinearLayout>
由于解析XML是耗时操作,所以我们在异步任务类中解析XML
URL url=new URL("http://192.168.43.169:8080/AndroidManifest.xml");
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式‘
connection.setRequestMethod("GET");
//设置请求连接超时的时间(优化)
connection.setConnectTimeout(5000);
//获取结果码
int code=connection.getResponseCode();
if(code==200){
//获取服务器返回过来的结果
InputStream is=connection.getInputStream();
}
首先我们获取网络数据,然后开始解析XML
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());
Element application=(Element)root.getElementsByTagName("application").item(0);
NodeList nodeList = application.getElementsByTagName("activity");
for (int i = 0; i <nodeList.getLength() ; i++) {
//获取单个
//Node
//Element
Element personElement= (Element) nodeList.item(i);
//获取<person>属性id的值
String name=personElement.getAttribute("android:name");
Log.i("android:name",name);
//获取<person>下面的子标签<name><age><image>的值
Element intent_filter= (Element) personElement.getElementsByTagName("intent-filter").item(0);
String intent_filter_content=intent_filter.getTextContent();
Log.i("test",intent_filter_content+" "+intent_filter.getPrefix());
}
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("activity".equals(localName)){
//取属性的值
String android_name=attributes.getValue(0);
Log.i("android:name",android_name);
}
}
@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("intent-filter".equals(cuurentTag)){
//获取<name>的值
String intent_filter=new String(ch,start,length);
Log.i("intent-filter", " "+intent_filter);
}
}
});
PUll解析的代码为
//03.使用PULL解析(类似SAX)
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("activity".equals(starttagName)){
//获取id的值
String android_name=xmlPullParser.getAttributeValue(0);
Log.i("android:name",android_name);
}
if("application".equals(starttagName)){
for (int i = 0; i < xmlPullParser.getAttributeCount(); i++) {
str+=xmlPullParser.getAttributeName(i)+"=\""+ xmlPullParser.getAttributeValue(i)+"\"\n";
}
}
cuurentTag=starttagName;
break;
case 4:
//获取id的值
if ("intent-filter".equals(cuurentTag)) {
String intent_filter=xmlPullParser.getText();
Log.i("intent_filter",intent_filter);
}
break;
case XmlPullParser.END_TAG:
cuurentTag=null;
break;
}
//细节:
type=xmlPullParser.next();
}