您的位置:首页 > 其它

STAX解析

2016-05-26 20:27 274 查看
STAX 拉模式xml 解析方式 —– 客户端程序,自己控制xml事件,主动调用相应事件方法

当使用XML PULL 如果使用Android系统,系统内置无需下载任何开发包,如果想JavaSE JavaEE 使用pull 解析技术 下载单独pull 开发工具包

xpp3 —– XML Pull Parser 3 是pull API 代码实现

使用pull 解析器

1、去网站上 下载 pull 解析器实现 xpp3 (Android 内置)

2、将 xpp3-1.1.3.4.C.jar 导入 java工程

导入jar包 位于 当前工程内部 , 在工程内新建 lib ,将jar复制过来 , 将pull 解析器 jar 添加build path

jar 包就是.class文件 集合压缩包 (采用zip格式压缩)

Pull解析器 使用 stax 解析方式 —- 拉模式解析

Pull采用将xml文档传递 解析器,手动通过next触发文档解析事件,在客户端代码中获取当前事件 ,从而调用相应事件处理方法

3、创建pull 解析器

4、将xml 文档内容传递 pull 解析器

为什么 STAX 解析方式 效率 好于 SAX ?

1、SAX 无选择性的,所有事件都会处理 解析方式,Stax 由用户控制需要处理事件类型

2、在使用Stax进行数据解析时,随时终止解析

Pull 解析器 生成 xml 文档功能 —- 通过 XmlSerializer 生成 xml 文档

解析xml : 文档开始、元素开始、文本元素、元素结束、文档结束

生成xml :生成文档声明(文档开始),元素开始、文本内容、元素结束 、文档结束

1、生成简单xml

2、通过对象数据生成xml

3、通过对象List数据生成xml

在程序中抽取两个方法 —– 1. xml — List对象 2. List对象生成xml

对内存中List进行CURD操作

XML 文件

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<companies>
<company>
<name>西藏大学</name>
<pnum>40000</pnum>
<address>拉萨</address>
</company>
<company>
<name>新疆大学</name>
<pnum>30000</pnum>
<address>新疆</address>
</company>
</companies>


编写一个 company实体

package com.qddx.ws;

public class company {

private String name;

public String getName() {
return name;
}

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

public int getPnum() {
return pnum;
}

public void setPnum(int pnum) {
this.pnum = pnum;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

private int pnum;
private String address;
}


解析的工具类

package com.qddx.ws;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
/*
* 抽取两个方法 XMl--list对象  list对象---XML
*
* */
public class PullUtils {

/*
* 接收xml文件返回list集合
*/
public static List<company> ParseXMLtoList(String fileName)
throws Exception {
// 获得解析器
List<company> companies = new ArrayList<company>();
XmlPullParser xmls = XmlPullParserFactory.newInstance().newPullParser();
// 设置xml输入文件
xmls.setInput(new FileInputStream(fileName), "UTF-8");
int event;
// 定义一个临时的company引用
company com = null;
while ((event = xmls.getEventType()) != XmlPullParser.END_DOCUMENT) {
// 将每个company对象封装成company对象
// 1.在company开始的时候 创建company对象
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("company")) {
com = new company();
}
// 2.读取name元素是时,向company对象封装name属性
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("name")) {
com.setName(xmls.nextText());
}
// 3.读取pnum属性时 向company对象封装pnum属性
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("pnum")) {
com.setPnum(Integer.parseInt(xmls.nextText()));

}
// 4.读取address属性时向company对象封装address属性
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("address")) {
com.setAddress(xmls.nextText());
}
// 读取company 结束时将company对象加入集合

if (event == XmlPullParser.END_TAG
&& xmls.getName().equals("company")) {
companies.add(com);
}
// 解析下一个事件
xmls.next();
}

return companies;
}
public static void ParseListtoXML(List<company> companies, String fileName)
throws Exception {
// 获得序列化对象
XmlSerializer xmls = XmlPullParserFactory.newInstance().newSerializer();

// 写文件之前 指定要输出的文件
xmls.setOutput(new FileOutputStream(fileName), "UTF-8");

// 文档开始
xmls.startDocument("UTF-8", true);
// 根元素开始
xmls.startTag(null, "companies");
for (company c : companies) {
// company属性开始
xmls.startTag(null, "company");
// name属性开始
xmls.startTag(null, "name");
// 文本属性
xmls.text(c.getName());
// name属性结束
xmls.endTag(null, "name");
// pnum属性开始
xmls.startTag(null, "pnum");
// 文本属性开始
xmls.text(c.getPnum() + "");
// pnum属性结束
xmls.endTag(null, "pnum");

// address属性开始
xmls.startTag(null, "address");
// 文本属性
xmls.text(c.getAddress());
// address属性结束
xmls.endTag(null, "address");
// company属性结束
xmls.endTag(null, "company");
}

// 根元素结束
xmls.endTag(null, "companies");

// 文档结束
xmls.endDocument();

}
}


测试 和增删改查

package com.qddx.ws;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

/*
* 完成pULL解析CURD
*
* */
public class PullCURD {
@Test
public void TestDelete() throws Exception {
// 1. 将xml数据加载到内存
List<company> companies = PullUtils.ParseXMLtoList("companies.xml");
// 从 List集合删除西藏大学的company对象
for (company com : companies) {
if (com.getName().equals("西藏大学")) {
companies.remove(com);
break;
}
}

// 3.回写到xml
PullUtils.ParseListtoXML(companies, "company_bak_xml");
}

@Test
public void TestUpdate() throws Exception {
// 将 xml数据加载到内存
List<company> companies = PullUtils.ParseXMLtoList("companies.xml");
// 遍历company集合
for (company com : companies) {
if (com.getName().equals("新疆大学")) {
com.setPnum(com.getPnum() * 2);
}
}
// 回写到xml
PullUtils.ParseListtoXML(companies, "company_bak.xml");
}

@Test
public void TestSelect() throws Exception {
// 解析xml数据到内存
List<company> companies = PullUtils.ParseXMLtoList("company.xml");
// 遍历company 集合
for (company com : companies) {
if (com.getName().equals("新疆大学")) {
System.out.println(com.getPnum());
}

}

}

@Test
public void TestAdd() throws Exception {
// 解析xml数据到内存
List<company> companies = PullUtils.ParseXMLtoList("company.xml");

company com = new company();
com.setName("江南");
com.setPnum(3000);
com.setAddress("南方的");
companies.add(com);
PullUtils.ParseListtoXML(companies, "company_bak.xml");
}

@Test
// 测试工具类PullUtils 中的方法
public void demo2() throws Exception {
// 将company。xml 复制 company_bak.xml
// 解析获得集合
List<company> companies = PullUtils.ParseXMLtoList("company.xml");
// 将集合写入 company_bak.xml
PullUtils.ParseListtoXML(companies, "company_bak.xml");
}

@Test
// 将xml中的数据---List集合
public void demo1() throws Exception {
// 获得解析器
XmlPullParser xmls = XmlPullParserFactory.newInstance().newPullParser();
List<company> companies = new ArrayList<company>();
company com = null;
// 向解析器传入xml文件
xmls.setInput(new FileInputStream("companies.xml"), "UTF-8");
// 遍历解析
int event;
while ((event = xmls.getEventType()) != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("company")) {
// 创建com对象
com = new company();
}

if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("name")) {
// 元素开始封装属性
com.setName(xmls.nextText());
}
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("pnum")) {
com.setPnum(Integer.parseInt(xmls.nextText()));
}
if (event == XmlPullParser.START_TAG
&& xmls.getName().equals("address")) {
com.setAddress(xmls.nextText());
}

if (event == XmlPullParser.END_TAG
&& xmls.getName().equals("company")) {
// 结束
companies.add(com);
}

xmls.next();
}
for (company c : companies) {
System.out.println(c.getName());
System.out.println(c.getAddress());
System.out.println(c.getPnum());
System.out.println("------------");

}

}

}


本笔记来源于 视频课程 仅供记录学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: