使用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. Codeforces Round #197 (Div. 2) : D

    这题也是一个线段树的水题: 不过开始题目没看明白,害得我敲了一个好复杂的程序.蛋疼啊.... 最后十几分钟的时候突然领悟到了题意,但是还是漏掉一个细节,老是过不去... 以后比赛的时候不喝啤酒了,再也 ...

  2. 在ubuntu 10.04下编译ffmpeg

    最近准备研究ffmpeg-2.0.1. 那得先运行起来看看效果吧. 首先去官网下载源码: 然后 解压=> ./configure => make  OK . 1. 编译好后,发现没有ffp ...

  3. RTSP

    相关博客: RTSP 很详细的英文文档 RTSP交互命令简介及过程参数描述   RTSP协议 http://blog.csdn.net/andyweike/article/details/621071 ...

  4. 【HDOJ】3047 Zjnu Stadium

    带权并查集. /* 3047 */ #include <iostream> #include <string> #include <map> #include &l ...

  5. wcf中netTcpBinding的元素构成

    <security> of <netTcpBinding> <transport> of <netTcpBinding> <message> ...

  6. Tag file directory /struts-tags does not start with "/WEB-INF/tags"

    使用自定义标签,记得引用路径 <%@taglib prefix="s" uri="/struts-tags" %>

  7. Linux学习笔记32——select()函数分析【转】

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...

  8. HDOJ/HDU 1556 Color the ball(树状数组)

    Problem Description N个气球排成一排,从左到右依次编号为1,2,3-.N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从 ...

  9. 各种jee服务器的比较,tomcat, jboss, glassfish, websphere, weblogic

    tomcat, 开源,只是一个 servlet jsp 容器. jboss, 开源,是一个j2ee 应用服务器,容器支持 servlet, jsp, ejb,jms等. 稳定且实现了全部j2ee ap ...

  10. [置顶] 深入理解android之IPC机制与Binder框架

    [android之IPC机制与Binder框架] [Binder框架.Parcel.Proxy-Stub以及AIDL] Abstract [每个平台都会有自己一套跨进程的IPC机制,让不同进程里的两个 ...