2009-03-18日记:ycl
今天我研究的主题是stax.[本人吐血推荐使用stax解析xml]
昨天研究的是sax一种推式解析方法,采用事件驱动的方式进行大型xml文件的解析.
其有两个方法如下:
startElement(String namespaceURI, String localName, String qName,
Attributes atts)throws SAXException
在开始处理元素的时候可以根据namespaceURI,localName,qName,atts来处理一些逻辑.
endElement(String namespaceURI, String localName, String qName)
throws SAXException
在处理元素结束的时候可以根据namespaceURI,localName,qName来处理一些逻辑.
characters(char[] ch, int start, int length)
处理元素的内容.
优点:采用事件驱动的模式进行xml的读取,只处理需要处理的元素.
缺点:其读取方式是推的,也就是不知道已经读过的东西,也不知道将要读什么.所以如果是采用sax
来读取大型xml一段内容的时候,必须自己定义逻辑来解析.完全破坏了xml的dom结构.
今天研究的是stax一种拉式解析方法,也是采用事件驱动的方式进行解析.
其实用性很简单,不用像sax那样必须继承一个handler.
InputStream input=new FileInputStream(new File("D://cata.xml"));
XMLStreamReader xmlStreamReader =inputFactory.createXMLStreamReader(input);
这样就已经初始化好了一个xml的流读取.
然后判断xmlStreamReader.hasNext()是否有下一个结点
然后循环xmlStreamReader.next()读取下一个结点.
(其原理和sax相似,都是以元素为单位进行读取.)
然后处理XMLStreamReader的以下事件.在需要处理的事件中写自己的逻辑,如果找到自己的东西了,那就返回
//START_DOCUMENT :一个文档的开始
//START_ELEMENT :一个元素的开始
//ATTRIBUTE :一个元素属性子
//NAMESPACE :一个命名空间声明
//CHARACTERS :字符可以是文本,或是一个空格
//COMMENT :一个注释
//SPACE :可忽略的空格
//PROCESSING_INSTRUCTION :处理指令
//DTD :一个DTD
//ENTITY_REFERENCE :一个实体参考
//CDATA :Cdata节
//END_ELEMENT :结束元素
//END_DOCUMENT :结束文档
//ENTITY_DECLARATION :一个实体声明
//NOTATION_DECLARATION :一个标志声明
之所以称stax为拉式,那是因为sax只有推,却无法停止解析,直到文档解析结束.故名思意,stax为拉,是因为 其能能在适当的时候刹车.
其优缺点和sax一样,只是多了一个功能,那就是拉,还有就是其控制比较简单,而且Axis2等主流webservice都 采用stax.因为一个请求过去,可能给你返回很多信息,而我们要的只是仅仅一小部分.