JAXP----SAX操作XML文件
阿新 • • 發佈:2019-02-12
1.SAX解析允許在讀取文件的時候,即對文件進行處理,而不必等到整個文件裝載完才會對文件進行操作!!!
sax採用事件處理方式解析XML檔案,涉及解析器和事件處理器
解析器可以使用JAXP的API建立,只要解析到XML文件的一個組成部分,都會去呼叫事件處理器的一個方法,解析器在呼叫事件處理器的方法時,會把當前解析到的xml文件內容作為方法的引數傳遞給事件處理器!
事件處理器由程式設計師編寫。
package it.git.sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class Demo { /* sax解析XML */ public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { // 建立工廠 SAXParserFactory factory = SAXParserFactory.newInstance(); // 建立解析器 SAXParser sp = factory.newSAXParser(); // 利用解析器得到reader XMLReader xr = sp.getXMLReader(); // 設定事件處理器 xr.setContentHandler(new MyContentHandler()); // 利用reader 讀取xml文件 xr.parse("src/book.xml"); } } //得到xml文件內容的事件處理器 class MyContentHandler implements ContentHandler { 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 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); } } 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 } } //獲取第一個節點的值 class MyContentHandler2 extends DefaultHandler { private boolean isOk= false; private int index=1; @Override public void characters(char[] ch, int start, int length) throws SAXException { if(isOk=true&&index==1){ System.out.println(new String(ch,start,length)); } } @Override public void endElement(String uri, String name, String attributes) throws SAXException { if(name.equals("售價")){ isOk=false; } } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if(name.equals("售價")){ isOk=true; index++; } } }