<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### 1.簡介 Dom解析功能強大,可增刪改查,操作時會將XML文檔讀到內存,因此適用于小文檔; SAX解析是從頭到尾逐行逐個元素解析,修改較為不便,但適用于只讀的大文檔; SAX采用事件驅動的方式解析XML。套用網友的解釋:如同在電影院看電影一樣,從頭到尾看一遍,不能回退(Dom可來來回回讀取),在看電影的過程中,每遇到一個情節,都會調用大腦去接收處理這些信息。SAX也是相同的原理,每遇到一個元素節點,都會調用相應的方法來處理。在SAX的解析過程中,讀取到文檔開頭、文檔結尾,元素的開頭和元素結尾都會調用相應方法,我們可以在這些方法中進行相應事件處理。 對應方法: ~~~ public void startDocument() throws SAXException { } public void endDocument() throws SAXException { } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { } public void endElement(String uri, String localName, String qName) throws SAXException { } ~~~ 我們還需一個方法來處理元素節點中間的文本節點(我們常誤以為元素節點的文本值) ~~~ public void characters(char[] ch, int start, int length) throws SAXException { } ~~~ ### 2.解析 解析步驟: (1)通過SAXParserFactory的靜態方法newInstance()方法獲取SAXParserFactory實例對象factory ~~~ SAXParserFactory factory = SAXParserFactory.newInstance(); ~~~ (2)通過SAXParserFactory實例的newSAXParser()方法返回SAXParser實例parser ~~~ SAXParser parser = factory.newSAXParser(); ~~~ (3)創建一個類繼承DefaultHandler,重寫其中的一些方法進行業務處理 ~~~ package com.qunar.handler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandler extends DefaultHandler{ // 用來標示解析開始 @Override public void startDocument() throws SAXException { } // 用來標示解析結束 @Override public void endDocument() throws SAXException { } // 用來遍歷XML文件的開始標簽 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); } // 用來遍歷XML文件的結束標簽 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); } } ~~~ (4)創建Handler類對象實例 ~~~ // 定義SAXParserHandler對象 SAXParserHandler handler = new SAXParserHandler(); ~~~ (5)解析XML文檔 ~~~ <?xml version="1.0" encoding="utf-8"?><bookstore> <book category="Java"> <title lang="chi">Java多線程編程核心技術</title> <author>高洪巖</author> <year>2015</year> <price>69.00</price> </book> <book category="C++"> <title lang="en">Effective C++: 55 Specific Ways to Improve Your Programs and Designs</title> <author>Scott Meyers</author> <year>2006</year> <price>58.00</price> </book> <book category="Web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2016</year> <price>39.95</price> </book> </bookstore> ~~~ ### 3.具體實例: ~~~ package com.qunar.handler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXParserHandler extends DefaultHandler{ private int bookIndex = 0; // 用來標示解析開始 @Override public void startDocument() throws SAXException { System.out.println("SAX解析開始..."); } // 用來標示解析結束 @Override public void endDocument() throws SAXException { System.out.println("SAX解析結束..."); } // 用來遍歷XML文件的開始標簽 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 調用DefaultHandler類的startElement方法 super.startElement(uri, localName, qName, attributes); // 開始解析book元素節點 if(qName.equals("book")){ ++ bookIndex; System.out.println("開始解析第" + bookIndex + "本書..."); // 已知book元素節點下的屬性名稱,根據屬性名稱獲取屬性值 /*String value = attributes.getValue("category"); System.out.println("value->"+value);*/ // 不知道book元素節點下的屬性名稱以及個數 int size = attributes.getLength(); for(int i = 0;i < size;++i){ System.out.println(attributes.getQName(i) + ":" + attributes.getValue(i)); }//for }//if else if(!qName.equals("bookstore")){ System.out.print(qName + ":"); }//else } // 用來遍歷XML文件的結束標簽 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); // 判斷一本書是否解析完 if(qName.equals("book")){ System.out.println("結束解析第" + bookIndex + "本書..."); }//if } @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String text = new String(ch, start, length); if(!text.trim().equals("")){ System.out.println(text); }//if } } ~~~ ~~~ package com.qunar.xml; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.qunar.handler.SAXParserHandler; /** * SAX方式解析XML文檔 * @author sjf0115 * */ public class SAXXMLCode { public static void main(String[] args) { String path = "D:\\bookstore.xml"; try { // 通過SAXParserFactory的靜態方法newInstance()方法獲取SAXParserFactory實例對象factory SAXParserFactory factory = SAXParserFactory.newInstance(); // 通過SAXParserFactory實例的newSAXParser()方法返回SAXParser實例parser SAXParser saxParser = factory.newSAXParser(); // 定義SAXParserHandler對象 SAXParserHandler handler = new SAXParserHandler(); // 解析XML文檔 saxParser.parse(path, handler); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ~~~ **運行結果:** <table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:1050px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:1049px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">SAX解析開始...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析第1本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">category:Java</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">title:Java多線程編程核心技術</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">author:高洪巖</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">year:2015</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">price:69.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析第1本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析第2本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">category:C++</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">title:Effective?C++:?55?Specific?Ways?to?Improve?Your?Programs?and?Designs</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">author:Scott?Meyers</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">year:2006</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">price:58.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析第2本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析第3本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">category:Web</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">title:Learning?XML</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">author:Erik?T.?Ray</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">year:2016</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">price:39.95</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析第3本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">SAX解析結束...</span></div></td></tr></tbody></table> ### 4.解析并儲存于對象中 ~~~ package com.qunar.bean; /** * book實體類 * @author sjf0115 * */ public class Book { private String category; private String title; private String author; private String year; private String price; private String lang; public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getLang() { return lang; } public void setLang(String lang) { this.lang = lang; } @Override public String toString() { return "category:" + category + " lang:" + lang + " title:" + title + " author:" + author + " year:" + year + " price:" + price; } } ~~~ ~~~ package com.qunar.handler; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.qunar.bean.Book; public class SAXParserHandler extends DefaultHandler{ private Book book; private int bookIndex = 0; // 節點文本內容 private String text; private List<Book> bookList = new ArrayList<Book>(); public List<Book> getBookList() { return bookList; } // 用來標示解析開始 @Override public void startDocument() throws SAXException { System.out.println("SAX解析開始..."); } // 用來標示解析結束 @Override public void endDocument() throws SAXException { System.out.println("SAX解析結束..."); } // 用來遍歷XML文件的開始標簽 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 調用DefaultHandler類的startElement方法 super.startElement(uri, localName, qName, attributes); // 開始解析book元素節點 if(qName.equals("book")){ // 創建一個book對象 book = new Book(); ++ bookIndex; System.out.println("開始解析第" + bookIndex + "本書..."); int size = attributes.getLength(); for(int i = 0;i < size;++i){ String attr = attributes.getQName(i); // 屬性category if(attr.equals("category")){ book.setCategory(attributes.getValue(i)); }//if }//for }//if // 用于遍歷title節點中的屬性 else if(qName.equals("title")){ int size = attributes.getLength(); for(int i = 0;i < size;++i){ String attr = attributes.getQName(i); // 屬性category if(attr.equals("lang")){ book.setLang(attributes.getValue(i)); }//if }//for }//else } // 用來遍歷XML文件的結束標簽 @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); // 判斷一本書是否解析完 if(qName.equals("book")){ bookList.add(book); book = null; System.out.println("結束解析第" + bookIndex + "本書..."); }//if else if(qName.equals("title")){ book.setTitle(text); }//else else if(qName.equals("author")){ book.setAuthor(text); }//else else if(qName.equals("year")){ book.setYear(text); }//else else if(qName.equals("price")){ book.setPrice(text); }//else } // 文本值 @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); text = new String(ch, start, length); } } ~~~ ~~~ package com.qunar.xml; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.qunar.bean.Book; import com.qunar.handler.SAXParserHandler; /** * SAX方式解析XML文檔 * @author sjf0115 * */ public class SAXXMLCode { public static void main(String[] args) { String path = "D:\\bookstore.xml"; try { // 通過SAXParserFactory的靜態方法newInstance()方法獲取SAXParserFactory實例對象factory SAXParserFactory factory = SAXParserFactory.newInstance(); // 通過SAXParserFactory實例的newSAXParser()方法返回SAXParser實例parser SAXParser saxParser = factory.newSAXParser(); // 定義SAXParserHandler對象 SAXParserHandler handler = new SAXParserHandler(); // 解析XML文檔 saxParser.parse(path, handler); // 得到遍歷結果 List<Book> bookList = handler.getBookList(); System.out.println("遍歷結果:"); for (Book book : bookList) { System.out.println(book); }//for } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } ~~~ **運行結果:** <table cellspacing="0" cellpadding="0" style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:1050px"><tbody><tr><td style="border-collapse:collapse; border:1px solid rgb(187,187,187); width:1049px"><br/><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">SAX解析開始...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析第1本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析第1本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析第2本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析第2本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">開始解析第3本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">結束解析第3本書...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">SAX解析結束...</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">遍歷結果:</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">category:Java??lang:chi???title:Java多線程編程核心技術???author:高洪巖???year:2015???price:69.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">category:C++??lang:en???title:Effective?C++:?55?Specific?Ways?to?Improve?Your?Programs?and?Designs???author:Scott?Meyers???year:2006???price:58.00</span></div><div><span style="font-size:14pt; color:windowtext; font-family:微軟雅黑">category:Web??lang:en???title:Learning?XML???author:Erik?T.?Ray???year:2016???price:39.95</span></div></td></tr></tbody></table>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看