您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何對XML進行Sax解析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
對XML進行Sax解析:
一、對XML進行Sax解析:
Sax解析XML是事件驅動的,安裝XML的順序一步一步進行解析的.優點不用事先調入整個文檔,占用資源少,缺點是事件過后,若沒保存數據,那么數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬于哪個元素.
二、實現:
1.創建一個XMl文檔:
<?xml version="1.0" encoding="UTF-8"?> <oracle > <user id="1" > <name>scott</name> <pwd>scott</pwd> </user> <user id="2"> <name>sys</name> <pwd>sys</pwd> </user> <user id="3"> <name>system</name> <pwd>system</pwd> </user> </oracle>
2.開始解析:
package Sax解析Xml; import java.io.File; 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.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SaxParser { public static void main(String[] args) { // 1.實例化SaxParserFactory對象 SAXParserFactory factory = SAXParserFactory.newInstance(); try { // 2.創建解析器: SAXParser saxParser = factory.newSAXParser(); // 3.獲取需要解析的文檔,生成解析器,解析文檔 File xmlFile = new File("myXml\\cb.xml"); MyHandler handler = new MyHandler(); // 開始解析: saxParser.parse(xmlFile, handler); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static class MyHandler extends DefaultHandler { // 作用是來記錄解析的上一個節點的名稱 private String preTag = null; private boolean ifEnd =false; private String getName; private String getPwd; @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub // super.characters(ch, start, length); if (preTag != null) { if ("name".equals(preTag)) { getName = new String(ch, start, length); } else if ("pwd".equals(preTag)) { getPwd = new String(ch, start, length); ifEnd=true; System.out.println(" <name>"+getName+"</name>"); System.out.println(" <pwd>"+getPwd+"</pwd>"); } } } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub // super.endDocument(); System.out.println(" </oracle>"); System.out.println("--------------------------"); System.out.println("解析XML完畢"); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if(ifEnd==true){ System.out.println(" </user>"); ifEnd=false; } //當一個標簽解析完后,preTag設置為null; preTag = null; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub System.out.println("開始解析XML文件"); System.out.println("------------------------------"); System.out.println("<?xml version="+"\""+1.0+"\""+ "encoding="+"\""+"UTF-8"+"\""+"?"+">"); System.out.println(" <oracle>"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub // <user id="1" > if ("user".equals(qName)) { String s = qName; String s1 = attributes.getValue(0);// Id String s2 = attributes.getLocalName(0); //System.out.println(s + s1 + s2); System.out.println(" <"+qName+" "+"id="+"\""+s1+"\""+">"); } preTag = qName; } } }
三、運行結果:
四、補充說明:
1.執行順序:
由于Sax解析是按照xml文件的順序來解析,當讀入<?xml.....>時,會調用startDocument()方法,當讀入<oracle>的時候,由于它是個ElementNode,所以會調用startElement(String uri, String localName, String qName, Attributes attributes),當要得到oracle孩子的信息是,就會調用characters(char[] ch, int start, int length)方法。
2.內部類加static關鍵字:
內部類是動態的,也就是開頭以public class開頭。而主程序是public static class main。在Java中,類中的靜態方法不能直接調用動態方法。只有將某個內部類修飾為靜態類,然后才能夠在靜態類中調用該類的成員變量與成員方法。所以在不做其他變動的情況下,最簡單的解決辦法是將public class改為public static class.
3.startElement(String uri, String localName, String qName,Attributes attributes) 方法的參數解釋:
感謝各位的閱讀!關于“如何對XML進行Sax解析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。