XML之StAX(一)
来源:互联网 发布:苹果手机最新电影软件 编辑:程序博客网 时间:2024/05/04 17:37
XML之StAX(一)
XML之StAX(二)
1.StAX
StAX是绑定在JDK中的,面向流和事件(Stream/Event)的XML解析器。StAX采用的是“pull“方式解析XML,即你的解析方法可以控制什么时候解析器继续向下解析,以及可以在任何位置停止解析。这就像解析方法在从解析器里拉XML事件一样。StAX的这种解析方式,意味着你不得不按照XML文件的元素,逐条移动StAX解析器,这就有点像Iterator或JDBC的ResultSet。StAX有以下特性:
- 可以解析XML文件的一部分之后就停止解析;
- 可以生成XML文件;
- 不支持XML模式验证。
同时,StAX提供了两种不同的解析API:
- XMLEventReader:像使用Iterator一样。
- XMLStreamReader:像使用JDBC的ResultSet一样。
2.面向Event的StAX
2.1XMLEventReader
XMLEventReader提供了一个nextEvent()方法,很像Iterator。通过Event对象,你可以查到你遇到Event的类型(如:element、text、comment等),同时Event element是不可变的。当你迭代到下一个Event时,之前的Event对象仍然被保存着。下面是一个用于测试的XML文件:
<?xml version="1.0" encoding="UTF-8"?><bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book></bookstore>
这是一个简单的XMLEventReader使用的例子:
public static void read()throws IOException {XMLInputFactory factory = XMLInputFactory.newFactory();Reader reader = null;try{reader = new FileReader("F:\\Codes\\IDEA\\Tools\\data\\xml\\test.xml");XMLEventReader eventReader = factory.createXMLEventReader(reader);while (eventReader.hasNext()){XMLEvent event = eventReader.nextEvent();// streamReader.getEventType() == XMLStreamReader.START_ELEMENT equals streamReader.isStartElement()if(event.isStartElement()){StartElement startElement = event.asStartElement();String name = startElement.getName().toString();if(!name.equals("bookstore") && !name.equals("book")) {System.out.print(name + ": ");System.out.println(eventReader.getElementText());}else if(name.equals("book")){System.out.println(startElement.getAttributes().next());}}}}catch (Exception e){e.printStackTrace();}finally {if(reader != null){reader.close();}}}
当然,在某些情况下,我们只需要得到特定标签的值,那么如果还像上述一样解析就白做和很多无用功。但是,不用担心,我们可以自定义过滤器作用于XMLEventReader,从而得到优化的效果。
public static void readFilter()throws IOException{XMLInputFactory factory = XMLInputFactory.newFactory();InputStream input = null;try{input = new FileInputStream(new File("F:\\Codes\\IDEA\\Tools\\data\\xml\\test.xml"));XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(input), new EventFilter() {@Overridepublic boolean accept(XMLEvent event) {if(event.isStartElement()){String name = event.asStartElement().getName().toString();if(name.equals("title") || name.equals("price")){return true;}}return false;}});while (reader.hasNext()){XMLEvent event = reader.nextEvent();if(event.isStartElement()){String name = event.asStartElement().getName().toString();System.out.println(name + ": " + reader.getElementText());}}}catch (Exception e){e.printStackTrace();}finally {if(input != null){input.close();}}}
2.2XMLEventWriter
XMLEvenWriter是StAX用于将Writer,OutputStream等对象的数据生成XML保存在Disk。下面是一个简单的例子:
public static void write(){XMLOutputFactory factory = XMLOutputFactory.newFactory();XMLEventFactory eventFactory = XMLEventFactory.newFactory();try {XMLEventWriter writer = factory.createXMLEventWriter(new FileWriter("F:\\Codes\\IDEA\\Tools\\data\\xml\\iterator.xml"));XMLEvent event = eventFactory.createStartDocument();writer.add(event);event = eventFactory.createStartElement("test", null, "bookstore");writer.add(event);event = eventFactory.createStartElement("test", null, "book");writer.add(event);event = eventFactory.createNamespace("google", "http://www.google.com");writer.add(event);event = eventFactory.createAttribute("category", "COMPUTER");writer.add(event);event = eventFactory.createStartElement("test", null, "author");writer.add(event);event = eventFactory.createCharacters("Giada De Laurentiis");writer.add(event);event = eventFactory.createEndElement("test", null, "author");writer.add(event);event = eventFactory.createEndElement("test", null, "book");writer.add(event);event = eventFactory.createEndElement("test", null, "bookstore");writer.add(event);writer.flush();writer.close();}catch (Exception e){e.printStackTrace();}}
产生的输出文件:
<?xml version="1.0" encoding="UTF-8"?><test:bookstore> <test:book xmlns:google="http://www.google.com" category="COMPUTER"> <test:author>Giada De Laurentiis</test:author> </test:book></test:bookstore>
注意:在使用XMLEventWriter生成XML文件时,必须为每一个元素指定一个前缀(如:例子中的“test”)
完整代码托管在:https://github.com/GatsbyNewton/xml-stax
文献:
http://www.w3school.com.cn/xml/index.asp
0 0
- XML之StAX(一)
- XML之StAX(二)
- Java XML解析之 StAX
- XML-----StAX
- Java与XML 之 SAX和StAX
- Java解析xml文档之STAX解析
- 使用stax操作xml(1)
- 使用stax操作xml(2)
- 使用stax操作xml(3)
- 使用stax操作xml(4)
- 使用stax操作xml(5)
- 使用stax操作xml(6)
- WebService(2)-XML系列之用Stax操作Xml
- WS-Security 中文问题&Stax(Streaming API for XML) (一)
- Stax处理XML(一)——基于光标的查找
- XML——写出XML文档(XSLT+StAX)
- StAX 生成XML文件
- StAX处理XML
- Google停止支持32位Linux版Chrome
- 宋浒智:黄金原油震荡下行 得不到的永远在骚动
- spring mvc controller跳转
- javascript中 string的charAt()和charCodeAt()方法
- 为什么要学习?
- XML之StAX(一)
- leetcode16.3SumClosest
- GEEK学习笔记— —程序员面试宝典笔记(四)
- Unity3d 游戏数学基础 未完结
- HDU 1022 Train Problem I
- 80端口复用:利用haproxy把http流量和ssh流量分别转发到web服务器和ssh服务器
- Android SDK Manager无法下载问题
- struts2开篇(一)
- 技术博客分店开张