您的位置:首页 > 其它

SAX和STAX解析xml文档

2017-07-19 16:21 253 查看
SAX 和 STAX 都是 基于事件驱动 ----- SAX推模式 STAX拉模式


SAX常用事件

startDocument() —- 文档开始事件

startElemen() —- 元素开始事件

characters() —- 文本元素事件

endElement() —- 元素结束事件

endDocument() —– 文档结束事件

为什么说SAX是推模式解析? 解析器控制xml文件解析,由解析器调用相应事件方法

在startElemen() endElement() 获得 开始和结束元素名称

在characters() 获得读取到文本内容

在startElemen() 读取属性值

案例如下:

public class Demo1 {
public static void main(String[] args) throws Exception {
// 1.建立工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 2.创建handler
SAXParser parser = factory.newSAXParser();
// 3.创建handler
Myhandler myhandler = new Myhandler();
// 3.将xml文档和handler同时传递给解析器
parser.parse(new File("sax.xml"), myhandler);
}
}

class Myhandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("start documnet。。。。。");
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(uri, localName, qName, attributes);
System.out.println("start element。。。。" + qName);
// 打印属性id
if (qName.equals("server")) {
System.out.println("id的属性值为" + attributes.getValue("id"));
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String content = new String(ch, start, length);
System.out.println("character:" + content);
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
super.endElement(uri, localName, qName);
System.out.println("end Element...." + qName);
}

@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("end Document....");
}
}


STAX拉模式解析xml—客户端程序,自己控制xmlshijian ,主动调用相应事件方法

当使用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.首先下载xpp3-1.1.3.4.c.jar包 2.创建xml pull解析器 --XmlPullParse 3.将xml文档内容传递 解析器
* 4。需要客户端程序手动完成解析 XmlPullParser存放解析方法。 next()
* @Test
public void demo() throws Exception {
// 创建工厂
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2。将xml文件传递给解析器
XmlPullParser parser = factory.newPullParser();
// 3.将xml文件传递给解析器
parser.setInput(new FileInputStream(new File("sax.xml")), "utf-8");
// 4.获取当前事件类型
/*
* int event = parser.getEventType(); System.out.println(event);
* parser.next(); int event2 = parser.getEventType();
* System.out.println(event2);
*/
int event = 0;
while ((event = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
// System.out.println(parser.getEventType());
if (event == XmlPullParser.START_TAG) {
// 所有数据从解析器获得
System.out.println(parser.getName() + "元素开始了");
}
// 但因哪个元素结束了
if (event == XmlPullParser.END_TAG) {
System.out.println(parser.getName() + "元素结束了");
}

parser.next();
}
}


====================通过pull解析器技术查看编程高手秘籍的价格

@Test
public void demo2() throws Exception {
// 1.创建pull解析器
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2.创建builder对象
XmlPullParser parser = factory.newPullParser();
// 3.将xml文件传递给解析器
parser.setInput(new FileInputStream("book.xml"), "utf-8");
// 通过循环驱动事件解析
int event1;
boolean isfound = false;
while ((event1 = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
// 获取开始元素name
if (event1 == XmlPullParser.START_TAG && parser.getName().equals("name")) {
String nextText = parser.nextText();
if (nextText.equals("java编程高手秘籍")) {
/*
* parser.next(); System.out.println("=====" + event1);
* parser.next(); String money = parser.nextText();
* System.out.println(money);
*/
isfound = true;
}
}
if (event1 == XmlPullParser.START_TAG && parser.getName().equals("price") && isfound) {
System.out.println(parser.nextText());
break;
}
parser.next();
}
}```


================================封装对象信息将对象写入到xml文件中

@Test
public void demo2() throws Exception {
Company company = new Company();
company.setName("中国石油");
company.setPnum(15);
company.setCompanyaddr("科学大道立交");
/**
* <company> <name>中国石油</name> <price>200</price>
* <address>科学大道立交</address> </company>
*/
// 获得序列化对象
XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
// 传递输出目标文件给序列化对象
serializer.setOutput(new FileOutputStream("company.xml"), "utf-8");
serializer.startDocument("utf-8", true);
serializer.startTag(null, "company");
serializer.startTag(null, "name");
serializer.text(company.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "pname");
serializer.text(company.getPnum() + "");
serializer.endTag(null, "pname");

serializer.endTag(null, "company");
serializer.endDocument();
}


================================pull解析器生成xml文档功能

@Test
public void demo1() throws Exception {
// 1.获取XmlSerializer对象

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializable = factory.newSerializer();
// 设置序列化输出文档
serializable.setOutput(new FileOutputStream("company.xml"), "utf-8");// 设定保存的编码集
/**
* 生成文档功能 通过XmlSerializer生成xml文档
*
*/
// 文档开始
serializable.startDocument("utf-8", true);// 设为独立的
// 元素开始
serializable.startTag(null, "company");// 没有命名空间空间 “” 或者null
// 文本元素
serializable.text("平顶山学院");
// 元素结束
serializable.endTag(null, "company");

// 文档结束
serializable.endDocument();
/**
* <?xml version="1.0" encodin="utf=8" standalong="yes"?>
* <compay>平顶山学院</company>
*/

}


工具类对xml文档进行curd操作

主要包含两个方法1.从xml文档中获取内容到list集合中。

2.同时接收xml文件和List集合,将集合众数据写入xml文件

package com.stax.pull.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.*;

import javax.swing.text.html.HTMLEditorKit.Parser;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;

/**
* 这样可以对xml文档进行curd操作 工具类 抽取两个方法,1.xml-----List 2.List----xml
*/
public class PullUtils {
/**
* 从xml文档中获取内容到list集合中。
*
* @return
*/
public static List<Company> parseXml3List(String filename) throws Exception {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(new FileInputStream(filename), "utf-8");
List<Company> list = new ArrayList<Company>();
Company company = null;
int event;
while ((event = parser.getEventType()) != parser.END_DOCUMENT) {
if (event == parser.START_TAG && parser.getName().equals("company")) {
company = new Company();
}
if ((event == parser.START_TAG && parser.getName().equals("name"))) {
company.setName(parser.nextText());
}
if ((event == parser.START_TAG && parser.getName().equals("pname"))) {
company.setPnum(Integer.valueOf(parser.nextText()));
}
if ((event == parser.START_TAG && parser.getName().equals("address"))) {
company.setCompanyaddr(parser.nextText());
}
if (event == parser.END_TAG && parser.getName().equals("company")) {
list.add(company);
}
parser.next();
}
return list;
}

/**
* 同时接收xml文件和List集合,将集合众数据写入xml文件
*
*/
public static void serializeList2Xml(List<Company> companies, String filename) throws Exception {
// 获取序列化对象
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlSerializer serializer = factory.newSerializer();
// 写入文件
serializer.setOutput(new FileOutputStream(filename), "utf-8");
// 文档开始
serializer.startDocument("utf-8", true);
// 根元素开始companies
serializer.startTag(null, "companies");
// 遍历集合List 每个List中Company对象生成一个片段
for (Company company : companies) {
System.out.println("=====" + company.toString());
// company开始
serializer.startTag(null, "company");
// name属性开始
serializer.startTag(null, "name");
serializer.text(company.getName());
// pnanme属性结束
serializer.endTag(null, "name");
// pname属性开始
serializer.startTag(null, "pnames");
serializer.text(String.valueOf(company.getPnum()));
// pname属性结束
serializer.endTag(null, "pnames");
// address属性开始
serializer.startTag(null, "address");
serializer.text(company.getCompanyaddr());
serializer.endTag(null, "address");
serializer.endTag(null, "company");
}
serializer.endTag(null, "companies");
serializer.endDocument();
}

}


封装的company类

package com.stax.pull.test;

import org.omg.CORBA.INTERNAL;

public class Company {
private String name;
private int pnum;
private String companyaddr;
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 getCompanyaddr() {
return companyaddr;
}
public void setCompanyaddr(String companyaddr) {
this.companyaddr = companyaddr;
}
@Override
public String toString() {
return "Company [name=" + name + ", pnum=" + pnum + ", companyaddr=" + companyaddr + "]";
}

}


xml文档

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<companies>
<company>
<name>中国石油</name>
<pname>15</pname>
<address>科学大道立交</address>
</company>
<company>
<name>CSDN</name>
<pname>1000</pname>
<address>西三旗</address>
</company>
</companies>


对所写的工具类进行测试

@Test
public void demo3() throws Exception {
/**
* 添加公司
*
*/
List<Company> companies = PullUtils.parseXml3List("company.xml");

Company company = new Company();
company.setCompanyaddr("经开大道");
company.setName("中燃国际");
company.setPnum(1000);
companies.add(company);
PullUtils.serializeList2Xml(companies, "company_bak.xml");

}


=============================

@Test
public void demo2() throws Exception {
/*
* 测试工具类PullCURD中方法
*
*/
// 将Comapny.xml文件复制给company_bak.xml;
// 解析结合
List<Company> listcompany = PullUtils.parseXml3List("company.xml");
PullUtils.serializeList2Xml(listcompany, "company_bak.xml");
}

@Test
public void demo() throws Exception {
List<Company> companies = new ArrayList<Company>();
Company company = null;
// 将xml文件的数据封装成list集合
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// 向解析器中传入xml文档
parser.setInput(new FileInputStream("company.xml"), "utf-8");
// 遍历解析
int event;
while ((event = parser.getEventType()) != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG && parser.getName().equals("company")) {
company = new Company();
}
if (event == XmlPullParser.END_TAG && parser.getName().equals("company")) {
companies.add(company);
}
if (event == XmlPullParser.START_TAG && parser.getName().equals("name")) {
// name元素开始
company.setName(parser.nextText());
}
if (event == XmlPullParser.START_TAG && parser.getName().equals("pname")) {
company.setPnum(Integer.valueOf(parser.nextText()));
}
if (event == XmlPullParser.START_TAG && parser.getName().equals("address")) {
company.setCompanyaddr(parser.nextText());
}
parser.next();
}
for (Company company2 : companies) {
System.out.println(company2.toString());
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml xml解析 stax解析