SAX解析XML

来源:互联网 发布:java子类继承父类属性 编辑:程序博客网 时间:2024/06/11 15:35

DOM和SAX解析的区别:

由于DOM方式在解析文档时,需要首先将整个XML 文档装载进内存,如果文档特别大,就会消耗计算机的大量内存,甚至导致内存溢出。

Sax方式在解析xml时无需加载整个文档
它允许解析器在读取文档的同时就对文档进行处理,而不必等到整个文档装载完才会文档进行操作。

Sax是以事件处理的方式对xml文档进行解析的,主要有两个核心对象: 解析器对象 和 处理器对象

解析器负责对文档进行解析,当解析到xml文档的某个组成部分,就会根据类型调用处理器对象相对应方法

EntityResolver, DTDHandler, ContentHandler, ErrorHandler这四个是接口!当触发什么事件就会调用相对应 的触发器!


使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
解析xml文件
xmlReader.parse("book.xml");


/**sax解析
* @throws Exception 
* @throws ParserConfigurationException 
*/
public static void main(String[] args) throws ParserConfigurationException, Exception {

//1.得到sax解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();

//2.得到sax解析器
SAXParser parser = factory.newSAXParser();

//3.得到xml读取器
XMLReader reader = parser.getXMLReader();

//4.注入事件处理器
reader.setContentHandler(new MyContentHandler1());


//5.开始解析xml文档
reader.parse("src/book.xml");
}



//获取整个xml文档的内容
class MyContentHandler implements ContentHandler{


        // 解析到文档开始标签时调用,name—标签名
public void startElement(String uri, String localName, String name,
Attributes atts) throws SAXException {
System.out.println("<" +  name + ">");
for(int i=0;i<atts.getLength();i++){
String attName = atts.getQName(i);
String attValue = atts.getValue(i);
System.out.println(attName + "=" + attValue);
}
}

       //  解析到结束标签时调用,name标签名
public void endElement(String uri, String localName, String name)
throws SAXException {

System.out.println("</" + name + ">");


}

         // 解析到内容时调用,会将内容放在一个字符数组里传给这个方法,并告诉我们解析的内容会放在字符数组 的什么位置。
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
}


public void endDocument() throws SAXException {
// TODO Auto-generated method stub
}


public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub
}


public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub

}


public void processingInstruction(String target, String data)
throws SAXException {
// TODO Auto-generated method stub

}


public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub

}


public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub

}


public void startDocument() throws SAXException {
// TODO Auto-generated method stub

}




public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO Auto-generated method stub

}
}



原创粉丝点击