您的位置:首页 > 移动开发 > Android开发

Android中XML数据解析

2016-10-17 22:19 375 查看
一般情况下服务器端返回给客户端的数据主要包括三种类型,字符串,xml,json,因此需要解析成为可读数据。xml数据传输,现在已经用的比较少了,而json用的比较广泛。不过还有一些免费的接口还是会返回xml形式数据,因此学习xml解析还是有必要的!!!



1、概述

什么是XML?可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。特点,可读性强,传输效率低。

XML常用解析方式:

SAX解析

PULL解析

DOM解析

废话少说直接撸码….

2、SAX解析

使用SAX解析XML是用的比较多的,主要由以下几个步骤:

得到SAXParserFactory对象

得到xml读取对象

设置内容处理器

开始解析

XML数据:

<xml>
<man>
<name>一一</name>
<age>11</age>
<address>北京</address>
</man>
<man>
<name>二二</name>
<age>22</age>
<address>济南</address>
</man>
</xml>


MainActivity.java

/**
* Created by magic on 2015年2月23日.SAX解析
*/
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);

try {

String string = "<xml><man><name>一一</name><age>11</age><address>北京</address></man>"
+ "<man><name>二二</name><age>22</age><address>济南</address></man></xml>";
// 单例模式 得到
SAXParserFactory factory = SAXParserFactory.newInstance();
// 得到xml读取对象
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
// 设置内容处理器
xmlReader.setContentHandler(new MyContentHandler());
// 解析
xmlReader.parse(new InputSource(new StringReader(string)));
} catch (Exception e) {
e.printStackTrace();
}
}

}


MyContentHandler.java内容处理器

/**
* Created by magic on 2015年2月23日.自定义类 继承DefaultHandler类
*/
public class MyContentHandler extends DefaultHandler {
String hisName, hisAge, hisAddress;
String tagName;

@Override
public void startDocument() throws SAXException {
// 开始解析
System.out.println("-----------begin-------------");
}

// uri: 命名空间 localName:没有前缀的标签 qName:有前缀的标签 attributes:标签的属性
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
tagName = localName;
if (tagName.equals("man")) {
// 输出属性名和值
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getLocalName(i) + ":"
+ attributes.getValue(i));
}
}
}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 解析数据实体并赋值
if (tagName.equals("name"))
hisName = new String(ch, start, length);
else if (tagName.equals("age"))
hisAge = new String(ch, start, length);
else if (tagName.equals("address"))
hisAddress = new String(ch, start, length);
}

@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
// 解析元素结束
if (localName.equals("man")) {
System.out.println("hisName------>" + hisName);
System.out.println("hisAge------>" + hisAge);
System.out.println("hisAddress------>" + hisAddress);
}
}

@Override
public void endDocument() throws SAXException {
// 解析结束
System.out.println("---------end-----------");
}

}


输出结果:



3、PULL解析

XML数据:

<students>
<student id="001">
<name>张三</name>
<age>20</age>
</student>
<student id="002">
<name>李四</name>
<age>21</age>
</student>
</students>


TwoActivity.java

/**
* Created by magic on 2015年2月23日. PULL解析
*/
public class TwoActivity extends Activity {
List<Student> students;
String s = "<students><student id='001' ><name>张三</name><age>20</age></student>"
+ "<student id='002'><name>李四</name><age>21</age></student></students>";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
try {
pullJXXml();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* pull解析xml
*
* @throws Exception
*/
private void pullJXXml() throws Exception {
// 创建一个XmlPullParser实例
XmlPullParser parser = Xml.newPullParser();
InputStream inputStream = new ByteArrayInputStream(s.getBytes());
// try {
// 设置输入流 并指明编码方式
parser.setInput(inputStream, "UTF-8");
int event = parser.getEventType();
Student s = null;
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
// 判断当前事件是否为文档开始标签
case XmlPullParser.START_TAG:
if (parser.getName().equals("students")) {
// 初始化students集合
students = new ArrayList<Student>();
} else if (parser.getName().equals("student")) {
// 得到标签属性
String id = parser.getAttributeValue(0);
s = new Student();
s.setId(id);
} else if (parser.getName().equals("name")) {
// 让解析器指向name属性的值
String name = parser.nextText();
s.setName(name);
} else if (parser.getName().equals("age")) {
// 让解析器指向age属性的值
String age = parser.nextText();
s.setAge(Integer.valueOf(age));
}
break;
// 判断当前事件是否为标签元素结束事件
case XmlPullParser.END_TAG:
if (parser.getName().equals("student")) {
// 将student添加到students集合
students.add(s);
}
}
// 进入下一个元素并触发相应事件
event = parser.next();
}

// 增强for输出
for (Student student : students) {
System.out.println("--->" + student.toString());
}
}

/**
* 自定义对象
*/
class Student {
private String id;
private String name;
private int age;

public Student() {
}

public Student(String id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age
+ "]";
}
}
}


输出结果:



4、DOM解析

未完待续……

5、XML解析实战

天气预报袖珍版Demo,该实例就是通过了网络接口获取数据(XML形式)、解析数据、设置数据等步骤。由于篇幅问题就不放上来了下面给出下载地址。

效果图:



很简单的,可以下下来跑一下~~~若有问题恳请指正,欢迎评论交流~

Demo下载地址:http://download.csdn.net/detail/magic_jss/9656315

爱我所爱,无怨无悔!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息