您的位置:首页 > 编程语言 > Java开发

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("____________");
}

}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: