java中XML文档解析3 (sax和stax的使用)
2016-07-15 11:39
423 查看
sax解析
SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且,由于应用程序只是在读取数据时检查数据,因此不需要将数 据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比 它的替代者DOM快许多。SAX解析器采用了基于事件的模型,它在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定 的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag.特别是当开发人员只需要处理文档中所包含的部分数据 时,SAX这种扩展能力得到了更好的体现。但用SAX解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
- 思想:利用监听的思想
解析xml的步骤:
注意:一定要按步骤
SAXParserFactory spf=SAXParserFactory.newInstance();//1 SAXParser parse=spf.newSAXParser();//2 XMLReader read=parse.getXMLReader();//3 read.setContentHandler(new DefaultHandler(){//4核心步骤 //继承想实现的方法(监听) }); read.parse("./xml4/users.xml");//5解析
例子:
* 需求:输出xml文档的数据信息,格式如下:
* id:A001
name:Jack
age:25
————
id:A002
name:张三
age:80
———–
SAXParserFactory spf=SAXParserFactory.newInstance(); SAXParser parser=spf.newSAXParser(); XMLReader read=parser.getXMLReader(); read.setContentHandler(new DefaultHandler(){ private String qElementName="!@#"; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(qName.equals("user")){ System.out.println("id:"+attributes.getValue(qName)); }else if(qName.equals("name")||qName.equals("age")){ qElementName=qName; } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(qName.equals("name")||qName.equals("age")){ qElementName="!@#"; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(qElementName!="!@#"){ System.out.println(new String(ch,start,length)); } } }); read.parse("./xml4/users.xml");
Stax
StAX的来历在JAXP1.3(JSR 206)有两种处理XML文档的方法:DOM(Document Object Model)和SAX(Simple API forXML).由于JDK6.0中的JAXB2(JSR 222)和JAX-WS 2.0(JSR224)都会用到StAX所以Sun决定把StAX加入到JAXP家族当中来,并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本),JDK6里面JAXP的版本就是1.4。
StAX是The Streaming API for XML的缩写,一种利用拉模式解析(pull-parsing)XML文档的API.StAX通过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件,解析事件可以看做是程序拉出来的,也就是程序促使解析器产生一个解析事件然后处理该事件,之后又促使解析器产生下一个解析事件,如此循环直到碰到文档结束符;SAX也是基于事件处理xml文档,但却是用推模式解析,解析器解析完整个xml文档后,才产生解析事件,然后推给程序去处理这些事件;DOM采用的方式是将整个xml文档映射到一颗内存树,这样就可以很容易地得到父节点和子结点以及兄弟节点的数据,但如果文档很大,将会严重影响性能。
用到的类:javax.xml.stream.XMLEventReader;
javax.xml.stream.XMLInputFactory;
javax.xml.stream.events.XMLEvent;
Stax只是sax的改进版
例子:
XMLInputFactory xef=XMLInputFactory.newFactory(); XMLEventReader reader=xef.createXMLEventReader(new FileReader("./xml4/users.xml")); while(reader.hasNext()){ XMLEvent xe=reader.nextEvent(); if(xe.isStartElement()){ StartElement se=xe.asStartElement(); if(se.getName().getLocalPart().equals("user")){ System.out.println("id:"+se.getAttributeByName(new QName("id")).getValue()); } if(se.getName().getLocalPart().equals("name")){ Characters chs=reader.nextEvent().asCharacters(); System.out.println("name:"+chs); } if(se.getName().getLocalPart().equals("age")){ Characters chs=reader.nextEvent().asCharacters(); System.out.println("age:"+chs); } } if(xe.isEndElement()){ EndElement ee=xe.asEndElement(); if(ee.getName().getLocalPart().equals("user")){ System.out.println("____________"); } } } }
相关文章推荐
- java json字符串转map
- 与spring整合shiro框架
- Java 继承的详解
- JAVA-jar包下载地址
- Java小例子(学习整理)-----学生管理系统-控制台版
- JAVA文件操作大全(5)
- Java文件操作大全(4)
- Ajax+Struts2实现验证码验证功能实例代码
- java中容易忽略的小细节
- java中容易忽略的小细节
- Java文件操作大全(3)
- Java文件操作大全(2)
- springMvc拦截器配置
- Spring 框架
- Java 判断文件夹、文件是否存在、否则创建文件夹
- JAVA文件操作大全(1)
- 以SpringMVC框架为中心疯狂扩展-05、添加ActiveMQ依赖
- Java文件操作(一)
- Java Heap and Stack
- Java—BIO (Block IO)