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.然后用注解的方式,很方便,自己只要 ...
随机推荐
- 在HTML下,如何为多个选择框提取数据并序列化
如果同时存在选择框及下拉框,如果用JQUERY获取相关数据呢? <form id="deploy-form"> <checkbox>多选框 <sele ...
- Android用户界面 UI组件--TextView及其子类(一) TextView
1.TextView android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none /web/email/phone/map/a ...
- Button with Hover Effect (Learned from 百度脑图)
今天想学学PM的技能, 打开了百度脑图的网站, 看到中间那个按键的hover效果蛮好看, 遂学习一下. 效果如下: Demo 其实就是利用:before绘制了半透明白色的遮罩, 平时用transfor ...
- 数据挖掘十大经典算法(5) 最大期望(EM)算法
在统计计算中,最大期望(EM,Expectation–Maximization)算法是在概率(probabilistic)模型中寻找参数最大似然估计的算法,其中概率模型依赖于无法观测的隐藏变量(Lat ...
- 在eclipse中使用jetty插件替代m2e开发调试maven web项目
第一步在相应的web项目上配置jetty插件,配置如下: <plugin> <groupId>org.mortbay.jetty</groupId> <art ...
- createElement
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Muduo源码库研究(笔记汇总)
声明: 本人学习Muduo源码, 有些代码会对其进行精简, 加上本人的一些理解, 所以与作者的代码可能有些不同. 如有理解错误的地方欢指出. Muduo基础库-时间戳类 http://www.cnbl ...
- 关于Session
转自:http://blog.csdn.net/wang379275614/article/details/9627755 Session理解: Session:在计算机中,尤其是在网络应用中,称 ...
- poj magic number
Problem H Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
- Unity优化之纹理集
发现了一个比较好用的插件:ProDrawCallOptimizer. 它是用来合并纹理和材质的,而且用起来非常简便. 操作方法: 1.将包拖入Unity5中:ps:由于版本问题,直接双击包时导入不了 ...