/** * 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); } }