本文是我在學習《Java核心技術》第九版卷II(高級特性)時寫的一段代碼。原書做者爲(美)Cay S. Horstmann,Gary Cornell,譯者爲陳昊鵬、王浩、姚建平等。個人Java版本爲1.8java
Java提供了兩種XML解析器:樹型解釋器DOM(Document Object Model,文檔對象模型),和流機制解析器SAX(Simple API for XML,XML簡單API)。若是文檔較大且處理算法又較爲簡單,可在運行時解析節點而沒必要看到完整的樹形結構時,DOM處理方式效率不如SAX。算法
XML文檔內容以下:學習
文件名:NameList.xml,文件路徑:C:\Users\Tsybius\Desktop\NameList.xmlui
<?xml version="1.0" encoding="UTF-8"?> <root> <list1> <person id="101" name="Tsybius" remark="1" /> <person id="102" name="Galatea" remark="2" /> <person id="103" name="Quintus" remark="3" /> <person id="104" name="Atia" remark="4" /> <person id="105" name="Justitia" remark="5" /> </list1> <list2> <person id="201" name="Zhang" remark="a" /> <person id="202" name="Wang" remark="b" /> <person id="203" name="Li" remark="c" /> <person id="204" name="Zhao" remark="d" /> <person id="205" name="Liu" remark="e" /> </list2> <text>TEXT</text> </root>
Java代碼以下:url
package XmlSaxTest; 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; /** * 使用SAX解析XML * @author Tsybius2014 * @date 2015年12月3日 * @time 下午9:46:40 * @remark * */ class XmlSaxTest { /** * 使用SAX解析XML * @param args */ public static void main(String[] args) { String filePath = "C:\\Users\\Tsybius\\Desktop\\NameList.xml"; File f = new File(filePath); //設置句柄 DefaultHandler handler = new DefaultHandler() { //XML文檔開始讀取時觸發 public void startDocument() { System.out.println("---------XML文檔解析開始---------"); } //XML文檔讀取結束時觸發 public void endDocument() { System.out.println("---------XML文檔解析結束---------"); } //讀取到某一元素時觸發 public void startElement(String namespaceURI, String lname, String qname, Attributes attrs) { System.out.println("節點開始:" + qname); if (qname.equals("person")) { System.out.println("id:" + attrs.getValue("id")); System.out.println("name:" + attrs.getValue("name")); System.out.println("remark:" + attrs.getValue("remark")); } } //某一元素結束時觸發 public void endElement(String url, String lname, String qname) { System.out.println("節點結束:" + qname); } //讀取元素值時觸發 public void characters(char[] ch, int start, int length) { String s = new String(ch, start, length); if (!s.isEmpty() && s.trim().length() > 0) { System.out.println("值:" + s); } } }; //使用SAX解析XML SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(false); try { SAXParser saxParser = factory.newSAXParser(); saxParser.parse(f, handler); } catch (ParserConfigurationException | SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("END"); } }
控制檯中輸出結果以下:spa
---------XML文檔解析開始--------- 節點開始:root 節點開始:list1 節點開始:person id:101 name:Tsybius remark:1 節點結束:person 節點開始:person id:102 name:Galatea remark:2 節點結束:person 節點開始:person id:103 name:Quintus remark:3 節點結束:person 節點開始:person id:104 name:Atia remark:4 節點結束:person 節點開始:person id:105 name:Justitia remark:5 節點結束:person 節點結束:list1 節點開始:list2 節點開始:person id:201 name:Zhang remark:a 節點結束:person 節點開始:person id:202 name:Wang remark:b 節點結束:person 節點開始:person id:203 name:Li remark:c 節點結束:person 節點開始:person id:204 name:Zhao remark:d 節點結束:person 節點開始:person id:205 name:Liu remark:e 節點結束:person 節點結束:list2 節點開始:text 值:TEXT 節點結束:text 節點結束:root ---------XML文檔解析結束--------- END
ENDcode