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. hbase数据模型以及编码压缩(转)

    原文链接:hbase源码系列(四)数据模型-表定义和列族定义的具体含义 hbase是一个KeyValue型的数据库,在<hbase实战>描述它的逻辑模型[行键,列族,列限定符,时间版本], ...

  2. 原创D3D几何实例化的DEMO

    CUBE的几何实例化DEMO 鼠标右键按下并拖动         旋转视角WSAD                         前后左右RF                             ...

  3. Linux进程调度的运行队列

    当Linux内核要寻找一个新的进程在CPU上运行时,必须只考虑处于可运行状态的进程,(即在TASK_RUNNING状态的进程),因为扫描整个进程链表是相当低效的,所以引入了可运行状态进程的双向循环链表 ...

  4. iOS开发-委托实战

    昨天晚上头疼,写了一部分草草的收笔了,早上起来补发一篇文章,昨天关于委托的基本使用和概念都稍微讲了一下,最开始学习委托的时候苹果官网和中文的博客文章看了不少,相似指数比较高.委托在命名要准确,最好是一 ...

  5. python3 把excel文件合并并保存到csv文件

    具体是这样,某路径下有很多 excel文件,文件名中包含相同关键字的是一类文件,把包含相同关键字的文件合并成一个文件,生成一个新的csv文件 # coding=utf-8 import xlrd im ...

  6. eclipse启动优化文章集合

    1. eclipse启动优化,终于不那么卡了! http://www.cfei.net/archives/445

  7. Web.config中加了system.diagnostics节点后就不能访问了

    Web.config中加了system.diagnostics节点后就不能访问了,怎么回事? [解决方法] 不要把system.diagnostics节点作为web.config的第一个节点.

  8. loadicon后一定要调用destroyicon吗

    Remarks It is only necessary to call DestroyIcon for icons and cursors created with the following fu ...

  9. Jmeter相关

    关于Jmeter,这里有一篇文章可以看看:http://www.cnblogs.com/TankXiao/p/4045439.html 给有需要的同学.

  10. asp.net 使用JS获得串口数据

    使用JS获得串口数据 JavaScript语言通常是一种网页编程语言,比较适合前台的一些应用设计.对于本地设备和数据的操作有比较大的限制.由于项目的需要,我需要获得本机的串口数据并显示在web端.我们 ...