/**
* XML语言
*/
Extensible Markup Language
可扩展的标记语言
研发初衷是替代不规范的Html,规范代码结构
现多用于存储数据,配置文件
1)数据结构严谨
2)允许自定义标签
/**
* XML命名规范
*/
1)区分大小写
2)不能以数字、下划线开头
3)不能以xml、Xml、XML开头
4)不能包含空格
5)不能包含冒号
/**
* XML文档声明 版本号 解析字符集 是否支持独立运行
*/
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
/**
* XML元素
*/
就是通常所说的标签
开始标签
结束标签
自闭和标签
/**
* XML中的空格和换行
*/
XML把空格和换行都做当做原始内容来处理,需要额外注意原始内容
/**
* XML解析
*/
解析:从XML文件中读取内容的过程
/**
* 利用DOM思想解析XML(安卓开发不使用)
*/
Document Object Model(文档对象模型)
出身:由W3C组织发布
特点:把文档中的所有内容都封装成对象
缺点:对象都保存在内存中,资源消耗过大,完全不适合移动端开发
/**
* 利用Sax思想解析XML(安卓开发不使用)
*/
原理:事件驱动
出身:国外论坛
优点:根据预定义的事件,对XML进行筛选,解析完成后只保留需要的内容,更节约资源
缺点:一次性读完XML,无法进行增删改操作
/**
* 利用Pull思想解析XML,用于安卓开发
*/
原理:事件驱动
优点:解析过程比Sax解析更加灵活,以事件为单位进行操作,事件完成后需手动调用继续进行
/**
* Pull解析案例
*/
//xml文件
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<students>
<student number="001">
<name>Tom</name>
<age>16</age>
<sex>Male</sex>
</student>
<student number="002">
<name>Jerry</name>
<age>18</age>
<sex>Female</sex>
</student>
<student number="003">
<name>Jack</name>
<age>21</age>
<sex>Male</sex>
</student>
<student number="004">
<name>Rose</name>
<age>24</age>
<sex>Female</sex>
</student>
</students>
//student模型
package com.wewezhang.jdbc_hello;
public class Student {
private String number;
private String name;
private String sex;
private int age;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
//导包
http://maven.ibiblio.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
BuildPath
//异常case expressions must be constant expressions
快捷键Ctrl+1 避免使用switch
//PullTool解析工具
package com.wewezhang.jdbc_hello;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
public class PullTool {
public static List<Student> parserXml(InputStream weInputStream) throws Exception {
//解析器工厂
XmlPullParserFactory weFactory = XmlPullParserFactory.newInstance();
//获得解析器
XmlPullParser weParser = weFactory.newPullParser();
//读取XML字节流
weParser.setInput(weInputStream, "UTF-8");
//获得当前事件的状态
int weType = weParser.getEventType();
//循环读取xml流
List<Student> weList = null;
Student weStudent = null;
while(weType != weParser.END_DOCUMENT) {
String weName = weParser.getName();
if (weType == weParser.START_TAG) {
if( "students".equals(weName) ){
weList = new ArrayList<Student>();
} else if( "student".equals(weName) ) {
weStudent = new Student();
weStudent.setNumber(weParser.getAttributeValue(0));
} else {
if( "name".equals(weName) ){
weStudent.setName(weParser.nextText());
}else if( "age".equals(weName) ){
weStudent.setAge(Integer.parseInt(weParser.nextText()));
}else if( "sex".equals(weName) ){
weStudent.setSex(weParser.nextText());
}
}
} else if (weType == weParser.END_TAG) {
if( "student".equals(weName) ){
weList.add(weStudent);
weStudent = null;
}
} else {
}
weType = weParser.next();
}
return weList;
}
//单元测试
@Test
public void funWeXml() throws Exception {
FileInputStream weInputStream = new FileInputStream("src/MyXml.xml");
List<Student> weList = parserXml(weInputStream);
System.out.print(weList);
}
}