JavaWeb

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

  

原文地址:https://www.cnblogs.com/WeWeZhang/p/6668265.html