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的影子,直接贴代码,以便我以后用到的时候忘了,注释我写 ...
随机推荐
- 混沌数学之Rössler(若斯叻)吸引子
若斯叻吸引子(Rössler attractor)是一组三元非线性微分方程: frac{dx(t)}{dt} = -y(t)-z(t) frac{dy(t)}{dt} = x(t)+a*y(t) fr ...
- 分布式唯一ID极简教程
原创 2017-11-21 帝都羊 架构师小秘圈 一,题记 所有的业务系统,都有生成ID的需求,如订单id,商品id,文章ID等.这个ID会是数据库中的唯一主键,在它上面会建立聚集索引! ID生成的核 ...
- 图解vue中 v-for 的 :key 的作用,虚拟dom Diff算法
其实不只是vue,react中在执行列表渲染时也会要求给每个组件添加上key这个属性. 要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了. 我们知道,vue和react都实现了一套虚拟D ...
- GoLang中 json、map、struct 之间的相互转化
1. golang 中 json 转 struct <1. 使用 json.Unmarshal 时,结构体的每一项必须是导出项(import field).也就是说结构体的 key 对应的首字母 ...
- Discuz上传错误
换了服务器后,上传图片的时候,显示上传100%,然后报错:upload error: 500.怎么回事那? [解决方法] 原来是php上传文件的时候,会首先上传到一个临时目录.如果临时目录没有权限,就 ...
- C#应用视频教程3.4 Halcon+C#测试
有了前面的基础后,我们来测试一下如何把程序做的更通用,首先是把初始化的方法修改一下,在初始化的时候传递过去HTuple这个对象(改成了全局的变量,以便于不同的方法调用) 其次需要有相机打开/相机关 ...
- Discuz常见小问题-如何修改导航栏
1 比如我要修改第一个导航栏,则在界面-导航设置,主导航,然后点击右边的编辑按钮 2 比如我把"首页"的名字改成"论坛首页",别的都不改,然后点击提交,刷新页面 ...
- SQL:1999基本语法(学习笔记)
SQL:1999基本语法 SELECT [DISTINCT] * | 列名称 [AS]别名,........ FROM 表名称1 [别名1][CROSS JOIN表名称2 别名2]| [NATURAL ...
- 【转】Spring中IoC的优点与缺点
1. 优点 我们知道,在Java基本教程中有一个定律告诉我们:所有的对象都必须创建:或者说:使用对象之前必须创建,但是现在我们可以不必一定遵循这个定律了,我们可以从Ioc容器中直接获得一个对象然后直接 ...
- Hadoop的简单使用
Hadoop的简单使用 使用Hadoop提供的命令行,向文件系统中创建一个文件. ./hadoop fs -put temp.txt hdfs://localhost:8888/ 说明: ./hado ...