java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml
JDK1.5需要添加jar包,1.6以后就不需要了
<dependency>
<groupId>stax</groupId>
<artifactId>stax-api</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.12</version>
</dependency>
JAXB:JAXB 的全名是Java ™ Architecture for XML Binding
Classroom.java
public class Classroom {
private int id;
private String name;
private int grade;
public Classroom() {
super();
// TODO Auto-generated constructor stub
}
public Classroom(int id, String name, int grade) {
super();
this.id = id;
this.name = name;
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return String.format("id:%d, name:%s, grade:%d", this.id, this.name, this.grade);
}
}
Student.java
@XmlRootElement
public class Student {
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Classroom getClassroom() {
return classroom;
} public void setClassroom(Classroom classroom) {
this.classroom = classroom;
} private int id;
private String name;
private int age;
private Classroom classroom; public Student() {
super();
// TODO Auto-generated constructor stub
} public Student(int id, String name, int age, Classroom classroom) {
super();
this.id = id;
this.name = name;
this.age = age;
this.classroom = classroom;
} @Override
public String toString() {
// TODO Auto-generated method stub
return String.format("id:%d, name:%s, Classroom=>%s", this.id, this.name, this.classroom.toString());
}
}
main方法:
public static void main(String[] args) throws JAXBException {
Student student = new Student(, "大帅哥", , new Classroom(, "计算机", ));
JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //格式化输出
marshaller.marshal(student, System.out);
StringWriter stringWriter = new StringWriter();
marshaller.marshal(student, stringWriter);
String xml = stringWriter.toString();
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
student = (Student) unmarshaller.unmarshal(new StringReader(xml));
System.out.println(student.toString());
}
STAX:StAX是Streaming API for XML的缩写,是一种针对XML的流式拉分析API。
使用XMLStreamReader和XMLEventReader读取XML文件
<?xml version="1.0" encoding="UTF-8"?>
<company>
<depart title="Develop Group">
<user name="Tom" age="28" gender="male" >Manager</user>
<user name="Lily" age="26" gender="female" />
</depart>
<depart title="Test Group">
<user name="Frank" age="32" gender="male" >Team Leader</user>
<user name="Bob" age="45" gender="male" />
<user name="Kate" age="25" gender="female" />
</depart>
</company>
JAVA代码
// 获得Stream解析器(指针读取器对象)
public static XMLStreamReader getStreamReader() {
XMLStreamReader reader = null;
String xmlFile = App.class.getResource("/").getFile() + "users.xml";
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
reader = factory.createXMLStreamReader(new FileReader(xmlFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return reader;
} // 获得Stream解析器(指针读取器对象),过滤器
public static XMLStreamReader getStreamReader(StreamFilter streamFilter) {
// 创建基于迭代器的指针读取器对象
XMLStreamReader filterReader = null;
String xmlFile = App.class.getResource("/").getFile() + "users.xml";
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
XMLStreamReader reader = factory.createXMLStreamReader(new FileReader(xmlFile));
filterReader = factory.createFilteredReader(reader, streamFilter);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return filterReader;
} // 列出所有用户名称
public static void listNames() {
// 创建基于迭代器的指针读取器对象
XMLStreamReader reader = App.getStreamReader();
// 遍历XML文档
try {
while (reader.hasNext()) {
int event = reader.next();
// 如果是元素的开始
if (event == XMLStreamConstants.START_ELEMENT) {
// 列出所有用户名称
if ("user".equalsIgnoreCase(reader.getLocalName())) {
System.out.println("Name:" + reader.getAttributeValue(null, "name"));
}
}
}
reader.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
} public static void listNamesAndAges() {
XMLStreamReader reader = App.getStreamReader();
try {
while (reader.hasNext()) {
// 跳过所有空白、注释或处理指令,到下一个START_ELEMENT
int event = reader.nextTag();
if (event == XMLStreamConstants.START_ELEMENT) {
if ("user".equalsIgnoreCase(reader.getLocalName())) {
System.out.println("Name:" + reader.getAttributeValue(null, "name") + ";Age:" + reader.getAttributeValue(null, "age"));
}
}
}
reader.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
} // 获得Event解析器(事件读取器对象)
public static XMLEventReader getEventReader() {
XMLEventReader reader = null;
String xmlFile = App.class.getResource("/").getFile() + "users.xml";
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
reader = factory.createXMLEventReader(new FileReader(xmlFile));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return reader;
} // 获得Event解析器(指针读取器对象),过滤器
public static XMLEventReader getEventReader(EventFilter eventFilter) {
// 创建基于迭代器的指针读取器对象
XMLEventReader filterReader = null;
String xmlFile = App.class.getResource("/").getFile() + "users.xml";
XMLInputFactory factory = XMLInputFactory.newInstance();
try {
XMLEventReader reader = factory.createXMLEventReader(new FileReader(xmlFile));
filterReader = factory.createFilteredReader(reader, eventFilter);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return filterReader;
} @SuppressWarnings("rawtypes")
public static void listAllByXMLEventReader() {
// 创建基于迭代器的事件读取器对象
XMLEventReader reader = App.getEventReader();
try {
// 遍历XML文档
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
// 如果事件对象是元素的开始
if (event.isStartElement()) {
// 转换成开始元素事件对象
StartElement start = event.asStartElement();
// 打印元素标签的本地名称
System.out.print(start.getName().getLocalPart());
// 取得所有属性
Iterator attrs = start.getAttributes();
while (attrs.hasNext()) {
// 打印所有属性信息
Attribute attr = (Attribute) attrs.next();
System.out.print(":" + attr.getName().getLocalPart() + "=" + attr.getValue());
}
System.out.println();
}
}
reader.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
} public static void listUsersByStreamFilter() {
XMLStreamReader streamFilterReader = App.getStreamReader(new StreamFilter() {
public boolean accept(XMLStreamReader reader) {
try {
while (reader.hasNext()) {
int event = reader.next();
// 只接受元素的开始
if (event == XMLStreamConstants.START_ELEMENT) {
// 只保留user元素
if ("user".equalsIgnoreCase(reader.getLocalName())) {
return true;
}
}
if (event == XMLStreamConstants.END_DOCUMENT) {
return true;
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
return false;
}
});
try {
// 列出所有用户的名称
System.out.println(streamFilterReader.getLocalName());
while (streamFilterReader.hasNext()) {
// 过滤工作已交由过滤器完成,这里不需要再做user的判断了
System.out.println("Name=" + streamFilterReader.getAttributeValue(null, "name"));
if (streamFilterReader.getEventType() != XMLStreamConstants.END_DOCUMENT) {
streamFilterReader.next();
}
}
streamFilterReader.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
} public static void listUsersByEventFilter() {
XMLEventReader eventFilterReader = App.getEventReader(new EventFilter() {
public boolean accept(XMLEvent event) {
// 如果事件对象是元素的开始
if (event.isStartElement()) {
// 转换成开始元素事件对象
StartElement start = event.asStartElement();
// 打印元素标签的本地名称
return "user".equals(start.getName().getLocalPart());
}
return false;
}
});
try {
// 列出所有用户的名称
while (eventFilterReader.hasNext()) {
XMLEvent event = eventFilterReader.nextEvent();
StartElement start = event.asStartElement();
System.out.println(start.getName().getLocalPart());
// 过滤工作已交由过滤器完成,这里不需要再做user的判断了
System.out.println("Name=" + start.getAttributeByName(new QName("name")).getValue());
}
eventFilterReader.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
// listNames();
// listNamesAndAges();
// listAllByXMLEventReader();
// listUsersByStreamFilter();
// listUsersByEventFilter();
}
转自:http://blog.chinaunix.net/uid-20749563-id-718396.html
转自:http://zangweiren.iteye.com/blog/647334
java JAXB + STAX(是一种针对XML的流式拉分析API)读取xml的更多相关文章
- xml解析之使用dom4j的api对xml文件进行CRUD(二)
在使用dom4j的api对xml文件进行CRUD(一)见博客http://blog.csdn.net/qq_32059827/article/details/51524330的基础上,再对做一次练习. ...
- java合并数组的几种方法,stream流合并数组
一.实例代码 package cc.ash; import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Array; i ...
- 基于Woodstox的StAX 2 (Streaming API for XML)解析XML
StAX (Streaming API for XML)面向流的拉式解析XML,速度快.占用资源少,非常合适处理大数据量的xml文件. 详细教程和说明可以参见以下几篇文章: 使用 StAX 解析 XM ...
- 通过Java读取xml文件内容
读取XML中的内容就需要对XML进行解析,目前对XML进行解析的方法分为四种: 下面解析的方法是DOM4J,需要下载jar包dom4j:https://dom4j.github.io/ package ...
- 读取xml文件转成List<T>对象的两种方法(附源码)
读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...
- DOM4J 读取XML配置文件进行数据库连接
介绍介绍DOM4J. 据说是非常优秀非常优秀的Java XML API(Dom4j is an easy to use, open source library for working ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- C#读取XML文件的基类实现
刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...
- asp.net读取xml方法
这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写 ...
随机推荐
- 【BZOJ】【1006】【HNOI2008】神奇的国度
弦图最小染色/MCS算法 Orz PoPoQQQ (UPD:ydc的写法好像更熟悉一些……(类似堆优化的Dij啊~ 先留个坑……明天再看一看……感觉好神奇>_<(完美消除序列之于弦图 就 ...
- 【BestCoder】【Round#42】
模拟+链表+DP Orz AK爷faebdc A Growin要跟全部的n个人握手共2n杯香槟,再加上每对关系的两杯香槟,直接统计邻接矩阵中1的个数,再加2n就是answer //BestCoder ...
- go语言基础之copy的使用
1.copy的使用 示例: package main //必须有个main包 import "fmt" func main() { srcSlice := []int{1, 2} ...
- dubbo+maven多模块项目单元测试
基本上就是记录各种报错的解决办法.基本上就是将散落在项目各个模块中的配置文件复制到测试模块中. 目录结构: ——src ——java ——test ——java ——DaoTest.java ——re ...
- 【nodejs】使用put方式向后端提交数据
页面代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Ty ...
- getaddrinfo()函数详解
Socket的地址查询函数 http://blog.sina.com.cn/s/blog_988c054b010139e3.html http://www.cnblogs.com/cxz2009/ar ...
- whereis 命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/11/09/2761928.html whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b) ...
- Java的类名与文件名必须一致(转)
原文:http://blog.csdn.net/shaoxiaoning/article/details/40424087 1.Java保存的文件名必须与类名一致: 2.如果文件中只有一个类,文件名必 ...
- VMWare虚拟机“锁定文件失败“怎么办?
虚拟机突然蓝屏了,然后就启动不了了,提示"锁定文件失败,打不开磁盘或快照所依赖的磁盘"的解决方法: 如果使用VMWare虚拟机的时候突然系统崩溃蓝屏,有一定几率会导致无法启动,会提 ...
- PyQt5——安装Eric6
Eric6是PyQt编程最理想的IDE.windows版的安装很简单.下面的安装也是在windows上进行的.linux版的我安装有点问题,有时间再折腾. 下载: Eric6官网:http://eri ...