什么是可扩展标记语言?
-
可扩展标记语言是一种很像 超文本标记语言 的标记语言
-
它的设计宗旨是 传输数据 ,而不是 显示数据
-
它的标签没有被预定义。您需要自行定义标签
-
它被设计为具有自我描述性
-
它是W3C的推荐标准
Android中解析XML数据的三种方式 :
-
SAX解析
(Simple API for XML)事件驱动,解析速度快,占用内存少 -
DOM解析
文档对象模型(Document Object Model)将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件 -
PULL解析
事件驱动, 在解析过程中, 我们需要自己获取产生的事件然后做相应的操作. Android系统内部在解析各种XML时是用PULL解析器
效果展示

xml.gif
代码
准备工作
-
users.xml(要解析的xml文件)
目录结构
目录结构

Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<users>
<user >
<name>保罗</name>
<age>10</age>
<sex>男</sex>
</user>
<user >
<name>金宝</name>
<age>30</age>
<sex>男</sex>
</user>
<user >
<name>缺心</name>
<age>18</age>
<sex>女</sex>
</user>
</users>-
User.java类
( 略 )
-
定义一个接口IUserParser.java
package com.lyp.xml;
import java.io.InputStream;
import java.util.List;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public interface IUserParser {
//解析输入流 得到User对象集合
List<User> parse(InputStream is) throws Exception;
}界面布局文件
- activty_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:andro
android:orientation="vertical"
android:layout_
android:layout_
android:padding="5dp">
<Button
android:
android:text="SAXParser"
android:textSize="25sp"
android:textAllCaps="false"
android:layout_
android:layout_/>
<Button
android:
android:text="DOMParser"
android:textSize="25sp"
android:textAllCaps="false"
android:layout_
android:layout_/>
<Button
android:
android:text="PULLParser"
android:textSize="25sp"
android:textAllCaps="false"
android:layout_
android:layout_/>
<TextView
android:
android:textSize="25sp"
android:layout_
android:layout_/>
</LinearLayout>开始定义实现IUserParser接口的解析类
方式一. SAX解析
package com.lyp.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public class UserSaxParser implements IUserParser {
@Override
public List<User> parse(InputStream is) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance(); //取得SAXParserFactory实例
SAXParser parser = factory.newSAXParser(); //从factory获取SAXParser实例
MyHandler handler = new MyHandler(); //实例化自定义Handler
parser.parse(is, handler); //根据自定义Handler规则解析输入流
return handler.getUsers();
}
//需要重写DefaultHandler的方法
private class MyHandler extends DefaultHandler {
private List<User> users;
private User user;
private StringBuilder builder;
//返回解析后得到的User对象集合
public List<User> getUsers() {
return users;
}
@Override
public void startDocument() throws SAXException {
super.startDocument();
users = new ArrayList<User>();
builder = new StringBuilder();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (localName.equals("user")) {
user = new User();
}
builder.setLength(0); //将字符长度设置为0 以便重新开始读取元素内的字符节点
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
builder.append(ch, start, length); //将读取的字符数组追加到builder中
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (localName.equals("id")) {
user.setId(Long.parseLong(builder.toString()));
} else if (localName.equals("name")) {
user.setName(builder.toString());
} else if (localName.equals("age")) {
user.setAge(Integer.parseInt(builder.toString()));
} else if (localName.equals("sex")) {
user.setSex(builder.toString());
} else if (localName.equals("user")) {
users.add(user);
}
}
}
}方式二. DOM解析
package com.lyp.xml;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public class UserDomParser implements IUserParser {
private List<User> mUsers;
@Override
public List<User> parse(InputStream is) throws Exception {
mUsers = new ArrayList<User>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//取得DocumentBuilderFactory实例
DocumentBuilder builder = factory.newDocumentBuilder(); //从factory获取DocumentBuilder实例
Document doc = builder.parse(is); //解析输入流,得到Document实例
Element rootElement = doc.getDocumentElement(); //获取根节点users
NodeList items = rootElement.getElementsByTagName("user"); //获取子节点user的集合
for (int i = 0; i < items.getLength(); i++) {
User user = new User();
Node item = items.item(i); //获取各个user节点
NodeList properties = item.getChildNodes(); //获取user节点下的各个子节点的集合
for (int j = 0; j < properties.getLength(); j++) {
Node property = properties.item(j); //获取各个子节点
String nodeName = property.getNodeName(); //获取各个子节点的名字
if (nodeName.equals("id")) {
user.setId(Long.parseLong(property.getFirstChild().getNodeValue()));
} else if (nodeName.equals("name")) {
user.setName(property.getFirstChild().getNodeValue());
} else if (nodeName.equals("age")) {
user.setAge(Integer.parseInt(property.getFirstChild().getNodeValue()));
} else if (nodeName.equals("sex")) {
user.setSex(property.getFirstChild().getNodeValue());
}
}
mUsers.add(user);
}
return mUsers;
}
}方式三. PULL解析
package com.lyp.xml;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ${思格斯} on 2016/9/22 0022.
*/
public class UserPullParser implements IUserParser{
@Override
public List<User> parse(InputStream is) throws Exception {
List<User> users = null;
User user = null;
// XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// XmlPullParser parser = factory.newPullParser();
XmlPullParser parser = Xml.newPullParser(); //由android.util.Xml创建一个XmlPullParser实例
parser.setInput(is, "UTF-8"); //设置输入流 并指明编码方式
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
users = new ArrayList<User>();
break;
case XmlPullParser.START_TAG:
if (parser.getName().equals("user")) {
user = new User();
} else if (parser.getName().equals("id")) {
eventType = parser.next();
if (user != null) {
user.setId(Long.parseLong(parser.getText()));
}
} else if (parser.getName().equals("name")) {
eventType = parser.next();
if (user != null) {
user.setName(parser.getText());
}
} else if (parser.getName().equals("age")) {
eventType = parser.next();
if (user != null) {
user.setAge(Integer.parseInt(parser.getText()));
}
} else if (parser.getName().equals("sex")) {
eventType = parser.next();
if (user != null) {
user.setSex(parser.getText());
}
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("user")) {
if (users != null) {
users.add(user);
}
user = null;
}
break;
}
eventType = parser.next();
}
return users;
}
}MainActivty.java
package com.lyp.xml;
import android.content.res.XmlResourceParser;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btnSax;
private Button btnDom;
private Button btnPull;
private TextView tvShow;
private List<User> userList;
private StringBuilder mBuilder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
mBuilder=new StringBuilder();
}
private void initView() {
btnSax= (Button) findViewById(R.id.btn_sax);
btnDom= (Button) findViewById(R.id.btn_dom);
btnPull= (Button) findViewById(R.id.btn_pull);
tvShow= (TextView) findViewById(R.id.tv_show);
btnSax.setOnClickListener(this);
btnDom.setOnClickListener(this);
btnPull.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
//case R.id.btn_sax:
//case R.id.btn_dom:
case R.id.btn_pull:
try {
//获取assets目录下的xml文件输入流
InputStream inputStream = getAssets().open("users.xml");
//Sax解析
//UserSaxParser saxParser = new UserSaxParser();
//userList = saxParser.parse(inputStream);
//Dom解析
//UserDomParser domParser = new UserDomParser();
//userList = domParser.parse(inputStream);
//Pull解析
UserPullParser pullParser = new UserPullParser();
userList = pullParser.parse(inputStream);
//将user集合中的数据读取出来
for (int i=0;i<userList.size();i++){
User user=userList.get(i);
long id= user.getId();
String name=user.getName();
int age=user.getAge();
String sex=user.getSex();
mBuilder.append("id:"+id +" name:"+name +" age:"+age +" sex:"+sex +"/r/n");
}
//将数据显示到TextView
tvShow.setText(mBuilder);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
来自:http://www.jianshu.com/p/00340117ff25
收藏的用户(0) X
正在加载信息~
推荐阅读
x86 emulation currently requires hardware acceleration
最新回复 (0)
站点信息
- 文章2313
- 用户1336
- 访客11756932
每日一句
Life is short; Live it!
人生苦短,活出精彩。
人生苦短,活出精彩。
信鸽推送报错NSObject checkTargetOtherLinkFlagForObjc
简单利用Clover四叶草安装U盘安装黑苹果
学习使用Java注解
OllyDbg中如何找出B模块中所有调用了A模块的C方法的地方
解决SSH客户端中文乱码
10年后,Android应用程序仍然比iOS应用程序差
C++11特性里面的thread
XPosed微信自动生成二维码
解决android studio "found an invalid color"的问题
T9社区注册方法【勼适様鲃女尔懟死】
Thinkpad x1 Extreme黑苹果10.14.5安装完成
基于大白主题增加图片本地化的功能
Linux系统查看CPU使用率的几个命令
新会员