XML簡介
Java的XML解析大概有四種,包括DOM、SAX、JDOM、DOM4J,其中DOM和SAX解析是基礎的兩種:XML 獨立於計算機平臺,操作系統和編程語言來表示數據,憑藉其簡單性、可擴展性、交互性和靈活性在計算機行業中得到了世界範圍的支持與採納,其作用主要有一下3點:
1)數據存儲:XOM和數據庫一樣,都可以實現數據的持久化存儲。兩者相比,數據庫提供了耿強有力的數據存儲和分析能力,XML僅僅是存儲數據,XML與其他數據表現形式最大的不同時它極其簡單。
2)數據交換:在實際應用中,由於各個計算機所使用的操作系統,數據庫不同,因此數據之間的交換想來是頭疼的事情,但可以使用XML交換數據來解決這個問題,例如:可以將數據庫A中的數據轉換成標準的XML文件,然後數據庫B再將該標準的XML文件轉換成適合自己數據要求的數據,以便達到交換數據的目的。
3)數據配置:許多應用都將配置數據存儲在XML文件中,使用XML配置文件可讀性強,靈活性高,不用像其他應用那樣要經過重新編譯才能修改和維護應用。
下面我們來看看用DOM來解析XML,DOM即可看成是基於樹的模型:
配置文件如下:
<?xml version = "1.0" encoding = "UTF-8"?> <pet> <dog id ="1"> <name>qizai</name> <age>5</age> <love>100</love> </dog> <dog id ="2"> <name>maomao</name> <age>3</age> <love>101</love> </dog> </pet>
下面用DOM來解析一下:
package my02; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class TestDOM { public static void main(String[] args) { // 1 得到DOM解析器的工廠實例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 2 從DOM工廠獲得DOM解析器 try { DocumentBuilder db = dbf.newDocumentBuilder(); // 3 解析XML文檔,得到一個Document,即DOM樹 Document doc = db.parse("D:/pet.xml"); // 4 得到所有pet節點列表信息 NodeList petList = doc.getElementsByTagName("dog"); // 5 輪循寵物信息 System.out.println("XML文件中的寵物初始化信息:"); for (int i = 0; i < petList.getLength(); i++) { Node pet = petList.item(i); for (Node node = pet.getFirstChild(); node != null; node = node .getNextSibling()) { if (node.getNodeType() == Node.ELEMENT_NODE) { String name = node.getNodeName(); String value = node.getFirstChild().getNodeValue(); System.out.println(name + ":" + value + "\t"); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
輸出結果如下:
XML文件中的寵物初始化信息: name:qizai age:5 love:100 name:maomao age:3 love:101
DOM有其優點:整個文檔樹在內存中,便於操作,支持刪除、修改、重新排列等多種功能;同樣它也有缺點:將整個文檔調入內存,浪費時間和空間。
SAX採用的是基於時間的模型,它在解析XML文檔時可以觸發一系列的時間,當發現給定的tag時,它可以激活一個毀掉方法,告訴該方法制定的標籤已經找到,可以在自定義的解析類中定義當事件觸發時要做的事情。
SAX解析的優點:不用事先調入整個文檔,若是再取值,才能取到字符數據內容,解析器代碼小,適於Applet下載;缺點:不是持久的,事件過後,如沒有保存數據,那麼數據就丟了,無狀態性,從時間中只能得到文本,但不知道文本屬於哪個元素,只需XML文檔的少量內容,很少回頭訪問,機器內存少。
下面看一個例子:XML同樣用上面的例子的
首先需建立一個Pet的實體類,下面是解析類
package my02; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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 SaxParseXML extends DefaultHandler{ private List<Pet> list = null; private Pet pet = null; private String preTagName = null; /* * 獲得pet集合的方法 */ public List<Pet> getPet(String fileURL) throws SAXException, IOException, ParserConfigurationException{ //獲得sax解析器工廠 SAXParserFactory factory = SAXParserFactory.newInstance(); //從工廠創建sax解析器 SAXParser parser = factory.newSAXParser(); //將指定的資源標識符(URL)描述的內容解析爲XML parser.parse(fileURL, this); //返回pet集合 return this.list; } /* * 開始文檔解析所調用的方法 */ public void startDocument() throws SAXException{ System.out.println("開始解析文檔!"); list = new ArrayList<Pet>(); } public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{ System.out.println(qName); if("dog".equals(qName)){ pet = new Pet(); String id = attributes.getValue("id"); pet.setId(Integer.parseInt(id)); } preTagName = qName; } public void endEliment(String url,String localName,String qName)throws SAXException{ if("dog".equals(qName)){ list.add(pet); pet = null; } preTagName = null; } public void characters(char[] ch,int start,int length)throws SAXException{ if("name".equals(preTagName)){ String content = new String(ch,start,length); pet.setName(content); }else if("age".equals(preTagName)){ String content = new String(ch,start,length); pet.setAge(content); }else if("love".equals(preTagName)){ String content = new String(ch,start,length); pet.setLove(content); } } public void endDocument(){ System.out.println("解析文檔結束!"); } }
測試以上代碼得出:
package my02; import java.io.IOException; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; public class SaxParseXMLTest { public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { SaxParseXML sax = new SaxParseXML(); String fileURL = "D:\\pet.xml"; List<Pet>list = sax.getPet(fileURL); for(Pet pet : list){ System.out.println(pet); } } } 輸出: 開始解析文檔! pet dog name age love dog name age love 解析文檔結束!
Xml文件中也可寫成JSON形式的,如下所示,格式更加清楚,利於讀取,如下所示:
{ "name":"張飛", "age":20, "address":{"city":"哈爾濱","street":"和興路"} }
下面看一個JSON的使用方法:
{ "name":"張飛", "age":20, "address":{"city":"哈爾濱","street":"和興路"} } 下面看一個JSON的使用方法: package day15.json; import org.json.JSONObject; public class TestJson { public static void main(String[] args) throws Exception { String strJson = getJson(); parseJson(strJson); } // json格式的字符串的生成 -- public static String getJson() throws Exception{ String strName = "張飛"; int niAge = 20; JSONObject json = new JSONObject(); json.put("name", strName); json.put("age", niAge); JSONObject js = new JSONObject(); js.put("city", "哈爾濱"); js.put("street", "和興路"); json.put("address", js); // json格式的字符串 System.out.println(json.toString()); return json.toString(); } public static void parseJson(String strJson) throws Exception{ JSONObject json = new JSONObject(strJson); String strName = json.getString("name"); int niAge = json.getInt("age"); JSONObject js = json.getJSONObject("address"); String strCity = js.getString("city"); String strStreet = js.getString("street"); System.out.println("姓名:"+strName+",年齡:"+niAge+",城市:"+strCity+",街道:"+strStreet); } }
從上可看出JSONObject的用法有點像HashMap的用法,關於XML現在真是不太瞭解,詳細請見以後的博客文章吧!歡迎來踩~