Java眼中的XML--文件读取--2 应用SAX方式解析XML
生活随笔
收集整理的這篇文章主要介紹了
Java眼中的XML--文件读取--2 应用SAX方式解析XML
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?1、獲取一個SAXParserFactory的實例。2、通過factory獲取SAXParser實例。
3、新建一個包和繼承自DefaultHandler的類。 因為SAX遍歷方式,比如便利一個節點<a></a>是需要startHandler便利起始標簽<a>,還需要endHandler便利結束標簽</a>。 4、將XML文件路徑和SAXParserHandler實例對象作為 SAXParser對象 的參數使用。然后運行驗證執行初始情況。 5、在SAXParserHandler類中添加一個訪問元素的方法,startElement。 6、所以需要進一步修改,條件過濾: 不過,以上是已知標簽屬性名稱的情況下使用的,getValue("id")獲取屬性值。下面是未知標簽屬性名稱以及個數的情況下,怎么訪問標簽屬性名和屬性值。 當我把XML的第一個book節點添加了一個屬性和屬性值,再運行上面的程序: 7、解析XML文件的節點名和節點間文本。這里需要endElemet方法打印輸出一個節點的訪問結束。 然后還要重寫一個方法characters方法,這個方法的第一個參數char[ ] ch這個是加載了整個xml的數據字節內容。 這里就直接上代碼吧: 注意這里用了去尾空格的方法,然后判斷為空字符。這個方法比較巧妙。 上代碼吧: 1 package com.goodboy.saxtest; 2 3 import java.io.IOException; 4 5 import javax.xml.parsers.ParserConfigurationException; 6 import javax.xml.parsers.SAXParser; 7 import javax.xml.parsers.SAXParserFactory; 8 9 import org.xml.sax.SAXException; 10 11 import com.goodboy.SAXParserHandler.SAXParserHandlerTest; 12 13 public class SAXTest { 14 15 public static void main(String[] args) { 16 SAXParserFactory factory = SAXParserFactory.newInstance(); 17 try { 18 SAXParser sax = factory.newSAXParser(); 19 //創建一個SAXParserHandler對象 20 SAXParserHandlerTest handler = new SAXParserHandlerTest(); 21 //作為參數使用 22 sax.parse("books.xml", handler); 23 } catch (ParserConfigurationException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } catch (SAXException e) { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 } catch (IOException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 } 34 35 } SAXTest(main) 1 package com.goodboy.SAXParserHandler; 2 3 import org.xml.sax.Attributes; 4 import org.xml.sax.SAXException; 5 import org.xml.sax.helpers.DefaultHandler; 6 7 public class SAXParserHandlerTest extends DefaultHandler { 8 @Override 9 public void startDocument() throws SAXException { 10 super.startDocument(); 11 System.out.println("解析開始"); 12 } 13 @Override 14 public void startElement(String uri, String localName, String qName, 15 Attributes attributes) throws SAXException { 16 super.startElement(uri, localName, qName, attributes); 17 System.out.println("=====開始訪問節點"+qName+"====="); 18 //這里的qName是標簽名 19 if (qName.equals("book") ) { 20 System.out.println("屬性的個數:"+attributes.getLength()); 21 for (int i = 0; i < attributes.getLength(); i++) { 22 String name = attributes.getQName(i); 23 System.out.println("屬性名:"+name); 24 String value = attributes.getValue(i); 25 System.out.println("屬性值:"+value); 26 } 27 }else if(!qName.equals("book") && !qName.equals("bookstore") ) { 28 System.out.print("屬性名:"+qName); 29 } 30 } 31 @Override 32 public void endElement(String uri, String localName, String qName) 33 throws SAXException { 34 super.endElement(uri, localName, qName); 35 System.out.println("=====結束訪問節點"+qName+"====="); 36 } 37 @Override 38 public void endDocument() throws SAXException { 39 super.endDocument(); 40 System.out.println("解析結束"); 41 } 42 @Override 43 public void characters(char[] ch, int start, int length) 44 throws SAXException { 45 super.characters(ch, start, length); 46 String name = new String(ch, start, length); 47 if (!name.trim().equals("")) { 48 System.out.println(" 節點中的內容:"+name); 49 } 50 } 51 } DefaultHandler對象?最后? 使用SAX解析將XML的內容和結構存入JAVA對象
1、建立一個book類:
后續步驟就制作動態圖片了,因為比較繁瑣,就直接上代碼了: <理解的要點,就是這里面的重寫的中間三個方法(startElement,characters,endElement),他們在解析XML的執行順序,然后合理的結合這些方法的參數,合理的使用全局變量,將XML轉為集合數據> 1 package com.goodboy.SAXParserHandler; 2 3 import java.util.ArrayList; 4 5 import org.xml.sax.Attributes; 6 import org.xml.sax.SAXException; 7 import org.xml.sax.helpers.DefaultHandler; 8 9 import com.goodboy.entity.Book; 10 11 public class SAXParserHandlerTest extends DefaultHandler { 12 Book book = null; 13 String value = null; 14 ArrayList<Book> booklist = new ArrayList<Book>(); 15 public ArrayList<Book> getBooklist() { 16 return booklist; 17 } 18 @Override 19 public void startDocument() throws SAXException { 20 super.startDocument(); 21 System.out.println("解析開始"); 22 } 23 @Override 24 public void startElement(String uri, String localName, String qName, 25 Attributes attributes) throws SAXException { 26 super.startElement(uri, localName, qName, attributes); 27 System.out.println("=====開始訪問節點"+qName+"====="); 28 //這里的qName是標簽名,也是集合的元素名 29 if (qName.equals("book") ) { 30 book = new Book(); 31 System.out.println("屬性的個數:"+attributes.getLength()); 32 for (int i = 0; i < attributes.getLength(); i++) { 33 if(attributes.getQName(i).equals("id")){ 34 book.setId(attributes.getValue(i)); 35 System.out.println("book.getId:"+book.getId()); 36 } 37 } 38 }else if(!qName.equals("book") && !qName.equals("bookstore") ) { 39 System.out.print("屬性名:"+qName); 40 } 41 } 42 @Override 43 public void characters(char[] ch, int start, int length) 44 throws SAXException { 45 super.characters(ch, start, length); 46 String name = new String(ch, start, length); 47 if (!name.trim().equals("")) { 48 System.out.println(" 節點中的內容:"+name); 49 value = name; 50 } 51 } 52 @Override 53 public void endElement(String uri, String localName, String qName) 54 throws SAXException { 55 super.endElement(uri, localName, qName); 56 System.out.println("=====結束訪問節點"+qName+"====="); 57 if (qName.equals("name")) { 58 book.setName(value); 59 } 60 if (qName.equals("author")) { 61 book.setAuthor(value); 62 } 63 if (qName.equals("year")) { 64 book.setYear(value); 65 } 66 if (qName.equals("prive")) { 67 book.setPrice(value); 68 } 69 if (qName.equals("language")) { 70 book.setLanguage(value); 71 } 72 if (qName.equals("book")) { 73 booklist.add(book); 74 book = null; 75 } 76 value = null; 77 } 78 @Override 79 public void endDocument() throws SAXException { 80 super.endDocument(); 81 System.out.println("book集合的長度"+booklist.size()); 82 System.out.println(booklist.get(0).getName()); 83 System.out.println("解析結束"); 84 } 85 }?
轉載于:https://www.cnblogs.com/goodboy-heyang/p/4747222.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java眼中的XML--文件读取--2 应用SAX方式解析XML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 3461 Oulipo(kmp统
- 下一篇: OC:数组排序、时间格式化字符串