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的更多相关文章

  1. xml解析之使用dom4j的api对xml文件进行CRUD(二)

    在使用dom4j的api对xml文件进行CRUD(一)见博客http://blog.csdn.net/qq_32059827/article/details/51524330的基础上,再对做一次练习. ...

  2. java合并数组的几种方法,stream流合并数组

    一.实例代码 package cc.ash; import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Array; i ...

  3. 基于Woodstox的StAX 2 (Streaming API for XML)解析XML

    StAX (Streaming API for XML)面向流的拉式解析XML,速度快.占用资源少,非常合适处理大数据量的xml文件. 详细教程和说明可以参见以下几篇文章: 使用 StAX 解析 XM ...

  4. 通过Java读取xml文件内容

    读取XML中的内容就需要对XML进行解析,目前对XML进行解析的方法分为四种: 下面解析的方法是DOM4J,需要下载jar包dom4j:https://dom4j.github.io/ package ...

  5. 读取xml文件转成List<T>对象的两种方法(附源码)

    读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...

  6. DOM4J 读取XML配置文件进行数据库连接

        介绍介绍DOM4J.    据说是非常优秀非常优秀的Java XML  API(Dom4j is an easy to use, open source library for working ...

  7. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  8. C#读取XML文件的基类实现

    刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node ...

  9. asp.net读取xml方法

    这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写 ...

随机推荐

  1. avi视频格式转yuv格式与播放yuv视频

    因为要用到yuv格式视频.而眼下仅仅有avi格式的视频,所以须要转换,而且opencv不支持yuv编码的视频播放.所以须要转换为rgb编码.而后播放.写了两个程序.以供參考: 1,avi格式视频转yu ...

  2. HBase性能调优(转)

    原文链接:http://www.blogjava.net/ivanwan/archive/2011/06/15/352350.html 因官方Book Performance Tuning部分章节没有 ...

  3. Maclean Liu对Oracle Database 12c新特性研究汇总

    Maclean Liu关于DB 12c新特性的研究文章如下: [Oracle Database 12c新特性] In-Database Archiving数据库内归档 [Oracle Database ...

  4. [置顶] 一道经典的sql面试题不同的写法

    用一条SQL语句   查询出每门课都大于80分的学生姓名,表( #test)如下:    Name Course Mark 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...

  5. go语言基础之append函数的使用

    1.append函数的使用 作用:在原切片的末尾添加元素 示例: package main //必须有个main包 import "fmt" func main() { s1 := ...

  6. Interpreter Expression 解释器模式 MD

    解释器模式 简介 Interpreter模式也叫解释器模式,是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法. 应用环境: 如果一种特定类 ...

  7. vue-router登录校验后跳转到之前指定页面如何实现

    两个需求:1.用户点击购买需要下单,并跳转到订单页面,但是如果用户没有登录的话,中间有登录验证,会拦截:2.点击购买的时候,登录校验成功了,跳转到订单页面时,订单已创建,去付款即可.3.处理拦截至登录 ...

  8. C++和.net的集合类对应

      Here's what I've found (ignoring the old non-generic collections): Array - C array, though the .NE ...

  9. Database Setup

    Database Setup This library has been developed so that you can use any type of backend storage; rela ...

  10. 线程池线程数与(CPU密集型任务和I/O密集型任务)的关系

    近期看了一些JVM和并发编程的专栏,结合自身理解,来做一个关于(线程池线程数与(CPU密集型任务和I/O密集型任务)的关系)的总结: 1.任务类型举例: 1.1: CPU密集型: 例如,一般我们系统的 ...