1.sax解析方式.
SAX(Simple API for XML)不是官方标准,但它是XML社区事实上的标准,几乎所有的XML解析器都支持它。
允许在读取文档的时候,即对文档进行处理,而不必等到整个文档加载完才对文档进行操作。
优点: 占用内存少,解析速度快,
缺点: 只适合文档的读取,不适合文档的增删改。
2.sax解析过程分析.
sax采用事件处理的方式解析xml文件,利用sax解析xml文档,涉及两个部分:解析器和事件处理器.
·解析器可以使用jaxp的API创建,创建出sax解析器后,就可以指定解析器去解析某个xml文档.
·解析器采用sax方式在解析某个xml文档时,它只要解析到xml文档的一个组成部分,都会去调用事件处理器的一个方法.
·解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器.
·事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理.
Jaxp开发包是JAVASE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。
在javax.xml.parsers包中,定义了几个工厂类,程序员调用这些工厂类,可以得到xml文档的DOM或SAX的解析器,从而实现对xml文档的解析。
sax解析图:
SAXParser Factory Content Handler
SAXParser Error Handler
XML --> SAX Reader DTD Handler
Entity Resolver
常用事件:ContentHandler.
常用方法:startElement、endElement、characters.
3.sax解析案例:得到xml文档所有内容.
public class demo1{
public static void main(String[] args){
//1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.得到解析器
SAXParser sp = factory.newSAXParser();
//3.得到读取器
XMLReader reader = sp.getXMLReader();
//4.设置内容处理器
reader.setContentHandler(new ListHandler());
//5.读取xml文档内容
reader.parse("src/book.xml");
}
}
//得到xml文档所有内容.
class ListHandler implements ContentHandler{
public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException{
System.out.println("<" + name + ">");
for(int i=0; atts!=null && i<atts.getLength(); i++){
String attName = atts.getQName(i);
String attValue = atts.getValue(i);
System.out.println(attName + "=" + attValue);
}
}
public void characters(char[] ch, int start, int length) throws SAXException{
System.out.println(new String(ch,start,length));
}
public void endElement(String uri, String localName, String name) throws SAXException{
System.out.println("<" + name + ">");
}
public void endDocument() throws SAXException{
//
}
}
4.sax解析案例:得到指定标签的值.
public class demo2{
public static void main(String[] args){
//1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.得到解析器
SAXParser sp = factory.newSAXParser();
//3.得到读取器
XMLReader reader = sp.getXMLReader();
//4.设置内容处理器
reader.setContentHandler(new TagValueHandler());
//5.读取xml文档内容
reader.parse("src/book.xml");
}
}
//得到指定标签的值
class TagValueHandler extends DefaultHandler{
private String currentTag; //当前标签
private int needNumber = 1; //想获取第几个作者标签的值
private int currentNumber; //当前解析到的是第几个
@Override
public void startElement(String uri, String localName, String name, Attributer attributers) throws SAXException{
currentTag = name;
if(currentTag.equals("作者")){
currentNumber++;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException{
if("作者".equals(currentTag) && currentNumber == needNumber){
System.out.println(new String(ch,start,length));
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException{
currentTag = null;
}
}
5.sax解析案例:
public class demo3{
public static void main(String[] args){
//1.创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.得到解析器
SAXParser sp = factory.newSAXParser();
//3.得到读取器
XMLReader reader = sp.getXMLReader();
//4.设置内容处理器
BeanListHandler handle = new BeanListHandler();
reader.setContentHandler(handle);
//5.读取xml文档内容
reader.parse("src/book.xml");
List<Book> list = handle.getBooks();
System.out.println(list);
}
}
//把xml文档中的每一本书的信息封装到一个book对象,并把多个book对象放在一个list集合中返回
class BeanListHandler extends DefaultHandler{
private List list = new ArrayList();
private String currentTag;
private Book book;
@Override
public void startElement(String uri, String localName, String name, Attributer attributers) throws SAXException{
currentTag = name;
if("书".equals(currentTag)){
book = new Book();
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException{
if("书名".equals(currentTag)){
String name = new String(ch,start,length);
book.setName(name);
}
if("作者".equals(currentTag)){
String author = new String(ch,start,length);
book.setAuthor(author);
}
if("售价".equals(currentTag)){
String price = new String(ch,start,length);
book.setPrice(price);
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException{
if(name.equals("书")){
list.add(book);
book = null;
}
currentTag = null;
}
public List getBooks(){
return list;
}
}
public class book{
private String name;
private String author;
private String price;
public String getName(){
return name;
}
public String setName(String name){
this.name = name;
}
public String getAuthor(){
return author;
}
public String setAuthor(String author){
this.author = author;
}
public String getPrice(){
return price;
}
public String setPrice(String price){
this.price = price;
}
}