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