使用stax操作xml 非常的简单,它的读取过程像是一个光标在移动。针对不同的节点做不同的处理。

先看一个基于光标的模型处理xml:

public class StaxTest {

    @Test
public void test1() {
try {
// 1.构建XMLStreamReader
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory
.createXMLStreamReader(StaxTest.class
.getResourceAsStream("books.xml"));
while (reader.hasNext()) {
int type = reader.next();
//是否是开始节点,开始节点就是<>
if(type==XMLStreamReader.START_ELEMENT){
System.out.println("<"+reader.getName()+">");
//是否是文本节点,开始节点和结束节点之间的内容
}else if(type==XMLStreamReader.CHARACTERS){
System.out.println(reader.getText());
//是否是结束节点,结束节点就是</>
}else if(type==XMLStreamReader.END_ELEMENT){
System.out.println("</"+reader.getName()+">");
}
}
} catch (FactoryConfigurationError | XMLStreamException e) {
e.printStackTrace();
}
}
@Test
public void test2() {
try {
// 1.构建XMLStreamReader
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory
.createXMLStreamReader(StaxTest.class
.getResourceAsStream("books.xml"));
while (reader.hasNext()) {
int type = reader.next();
//输出所有book节点的属性,0表示是第几个参数
if(type==XMLStreamReader.START_ELEMENT){
if (reader.getName().toString().equals("book")) {
System.out.println(reader.getAttributeName(0) + ":"
+ reader.getAttributeValue(0));
}
}
}
} catch (FactoryConfigurationError | XMLStreamException e) {
e.printStackTrace();
}
}
@Test
public void test3() {
try {
// 1.构建XMLStreamReader
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory
.createXMLStreamReader(StaxTest.class
.getResourceAsStream("books.xml"));
while (reader.hasNext()) {
int type = reader.next();
//输出每本书的名称和价格,
if(type==XMLStreamReader.START_ELEMENT){
if (reader.getName().toString().equals("name")) {
System.out.print(reader.getName()+":"+reader.getElementText());
}
if (reader.getName().toString().equals("price")) {
System.out.println(reader.getName()+":"+reader.getElementText());
}
}
}
} catch (FactoryConfigurationError | XMLStreamException e) {
e.printStackTrace();
}
}
}
<books>
<book category="编程技术" edition="8">
<id>1</id>
<name>Java编程思想</name>
<price>80</price>
<author>张三</author>
<detail>
<pressTime>天朝</pressTime>
<storyTime>21世纪</storyTime>
</detail>
</book>
<book category="历史小说" edition="1">
<id>2</id>
<name>三国演义</name>
<price>30</price>
<author>罗贯中</author>
<detail>
<pressTime>明朝</pressTime>
<storyTime>汉末</storyTime>
</detail>
</book>
<book category="小说" edition="2">
<id>3</id>
<name>红楼梦</name>
<price>35</price>
<author>曹雪芹</author>
<detail>
<pressTime>清朝</pressTime>
<storyTime>不详</storyTime>
</detail>
</book>
<book category="神话小说" edition="4">
<id>4</id>
<name>西游记</name>
<price>25</price>
<author>吴承恩</author>
<detail>
<pressTime>明朝</pressTime>
<storyTime>大唐</storyTime>
</detail>
</book>
<book category="小说" edition="5">
<id>5</id>
<name>水浒传</name>
<price>30</price>
<author>施耐庵</author>
<detail>
<pressTime>明朝</pressTime>
<storyTime>大宋</storyTime>
</detail>
</book>
</books>

还有一种处理方式是基于迭代模型的处理方式,基于迭代模型与基于光标模型非常相似,看代码:

    @Test
public void test4(){
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader reader = factory.createXMLEventReader(StaxTest.class.getResourceAsStream("books.xml"));
while(reader.hasNext()){
XMLEvent event = reader.nextEvent();
if(event.isStartElement()){
System.out.println("<"+event.asStartElement().getName()+">");
}else if(event.isCharacters()){
System.out.println(event.asCharacters().getData());
}else if(event.isEndElement()){
System.out.println("</"+event.asEndElement().getName()+">");
}
}
} catch (FactoryConfigurationError | XMLStreamException e) {
e.printStackTrace();
} }

这一段代码输出结果与test1()输出结果完全相同,基于迭代模型就是要先将event.as****,然后操作与基于光标模型完全相同。

再看看给迭代模型添加过滤器,

    @Test
public void test5() {
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader reader = factory.createFilteredReader(factory
.createXMLEventReader(StaxTest.class
.getResourceAsStream("books.xml")), (event) -> {
if(event.isStartElement()) return true;
return false;
});
while(reader.hasNext()){
XMLEvent event = reader.nextEvent();
System.out.println(event.asStartElement().getName());
}
} catch (FactoryConfigurationError | XMLStreamException e) {
e.printStackTrace();
}
}

上面这一段给迭代模型添加了一个过滤器,这里是用到了jdk8的最新特性lambda表达式来简化了操作,过滤器返回所有的开始节点。

Java Stax操作XML简介的更多相关文章

  1. WebService(2)-XML系列之用Stax操作Xml

    源代码下载:链接: http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:利用Stax处理xml文档 一.读取xml 1.基于光标的查找 核心:X ...

  2. Delphi操作XML简介

    参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...

  3. 使用JDK自带的Stax操作XML

    操作的books.xml <?xml version="1.0" encoding="UTF-8"?> <bookstore> < ...

  4. 摘抄的 JAVA JDOM 操作XML文件

    JDOM修炼篇 用过XERCES的程序员都会感到,有时候用一句话就可以说清楚的事,当用XERCES的API来实现时,要三四行程序.   回页首 获得并安装JDOM 在 http://www.jdom. ...

  5. Java文件操作①——XML文件的读取

    一.邂逅XML 文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输.所以XML在现今应用程序中是非常流行的.本文主要讲Java解析和生成XML.用于不同平台.不同设备间的数据 ...

  6. java DOM 操作xml

    1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...

  7. Java操作XML的JAXB工具

    在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...

  8. Java操作xml文件

    Bbsxml.java public class Bbsxml { private String imgsrc; private String title; private String url; p ...

  9. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

随机推荐

  1. OneAlert 入门(四)——事件分派和通知必达

    OneAlert 是国内首个 SaaS 模式的云告警平台,集成国内外主流监控/支撑系统,实现一个平台上集中处理所有 IT 事件,提升 IT 可靠性.有了 OneAlert,你可以更快更合理地为事件划分 ...

  2. 使用eclipse开发webService很简单

    原文转自:http://blog.csdn.net/guo_rui22/article/details/6253745 使用Eclipse生成一个WebService应用 1.创建一个Dynamic ...

  3. VC提交网页表单(一共八篇)

    VC提交网页表单-自动评论留言(1)http://blog.csdn.net/wangningyu/article/details/4526357VC提交网页表单-自动评论留言(2)http://bl ...

  4. 深入了解View实现原理以及自定义View详解

    下面几篇文章对View的原理讲的非常详细. Android LayoutInflater原理分析,带你一步步深入了解View(一) Android视图绘制流程完全解析,带你一步步深入了解View(二) ...

  5. Windows下Redis中RedisQFork位置调整

    redis-server.exe redis.windows.conf 使用上面命令启动redis服务的时候报了以下错误信息: The Windows version of Redis allocat ...

  6. Java中int与Integer

    一般小写字母开头的是数据类型(如int double),大写字母开头的一般是封装为类(如Double),里面有很多方法,比如实行转换Integer.parseInt(arg0),可以把其他类型的数据转 ...

  7. C++ Prime:const的引用

    可以把引用绑定到const对象上,就像绑定到其他对象上一样,我们称之为对常量的引用.与普通引用不同的是,对常量的引用不能被用作修改它所绑定的对象: ; const int &r1 = ci; ...

  8. POJ_3068_Shortest_pair_of_paths_(最小费用流)

    描述 http://poj.org/problem?id=3068 危险品:N个仓库由M条有向边连接,每条边都有一定费用.将两种危险品从0运到N-1,除了起点和终点外,危险品不能放在一起,也不能走相同 ...

  9. qt容器在并发时需要注意的地方

    最近用tbb和qt写了一个延时摄影后期控制镜头的工具,主要就是扫描目录下所有图片,按照给定参数截取图片中某区域并另存,模拟镜头摆动. 扫描后的图片路径保存在qlist内,作为只读数据,交由tbb的pa ...

  10. 解决Windows8系统磁盘占用太多100%或99%

    关闭家庭组功能:WIN+R运行Services.msc,找到 HomeGroup Listener 和 HomeGroup Provider 服务,分别停止和禁用这2个服务.然后重新启动Windows ...