Java Stax操作XML简介
使用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简介的更多相关文章
- WebService(2)-XML系列之用Stax操作Xml
源代码下载:链接: http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:利用Stax处理xml文档 一.读取xml 1.基于光标的查找 核心:X ...
- Delphi操作XML简介
参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...
- 使用JDK自带的Stax操作XML
操作的books.xml <?xml version="1.0" encoding="UTF-8"?> <bookstore> < ...
- 摘抄的 JAVA JDOM 操作XML文件
JDOM修炼篇 用过XERCES的程序员都会感到,有时候用一句话就可以说清楚的事,当用XERCES的API来实现时,要三四行程序. 回页首 获得并安装JDOM 在 http://www.jdom. ...
- Java文件操作①——XML文件的读取
一.邂逅XML 文件种类是丰富多彩的,XML作为众多文件类型的一种,经常被用于数据存储和传输.所以XML在现今应用程序中是非常流行的.本文主要讲Java解析和生成XML.用于不同平台.不同设备间的数据 ...
- java DOM 操作xml
1 代码如下: package dom.pasing; import java.io.IOException; import java.io.StringWriter; import javax.xm ...
- Java操作XML的JAXB工具
在java中操作XML的工作中中,比较方便的工具是JAXB(Java Architecture for XML Binding). 利用这个工具很方便生成XML的tag和Java类的对应关系.参照网上 ...
- Java操作xml文件
Bbsxml.java public class Bbsxml { private String imgsrc; private String title; private String url; p ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
随机推荐
- 【BZOJ 2154】Crash的数字表格 (莫比乌斯+分块)
2154: Crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能 ...
- [转贴]JAVA :CXF 简介
Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF.CXF 继 ...
- leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree
leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree 1 题目 Binary Search Tre ...
- ActivityManager的使用
本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...
- winform异型不规则界面设计
一,不规则WINFORM窗体 Author:unknown From:Internet在以前版本的Visual Basic或Visual C++中,创建不规则窗体和控件是一件很复杂的事,不仅需要调用大 ...
- Linux创建新用户以及useradd adduser的区别
从阿里云那弄了个机子玩玩,系统用的是Ubuntu12.04.刚等上去时候是用root登录的,首先想到的就是创建一个用户. 使用 useradd myname 发现/home目录下没有myname的家目 ...
- Java---replace与replaceAll的区别
乍一看,字面上理解好像replace只替换第一个出现的字符(受javascript的影响),replaceall替换所有的字符,其实大不然,只是替换的用途不一样. 这两者很容易搞混,在这里详细讲述下. ...
- Spring框架整合Struts2
1,用Spring架构,及Struts2-spring-plugin插件 导入Spring的dist全部所需的jar包 Struts2的spring插件 struts2-spring-plugin.X ...
- 关于缓存的tips——HTTP权威指南读书心得(十三)
上一章介绍了缓存新鲜度判断的基本原理,本章对于缓存新鲜度判断方法进行一些补充(更新间隔略长略长..). 关于缓存的TIPS 服务器可以通过http定义的几种header对可以缓存数据的存在时间进行控制 ...
- 一个简单的DELPHI程序注册码设计 .
当你辛辛苦苦用DELPHI做好了一个你认为十分不错的程序,你是否想把它发布出去成为共享软件呢 做为一个共享软件,注册码肯定是少不了的,你可以通过判断程序是否注册来进行功能,时间或一些其它限制.现在就 ...