剛剛看到一條微博
今天距離2009級離校倒計時還有100天
借用“三國殺”裡面張遼歸天說的一句話——“真的沒想到”。這渾渾噩噩的四年沒想到就快沒了。沒想到啊。
臨近畢業季,雖說沒課,但是繁瑣的事情很多。工作,畢業設計,論文,實習報告……單單找工作就讓焦頭爛額。也就因為這諸多的原因,部落格很久沒有更新。這也算是給某公司面試官的回答吧。
言歸正傳,技術人終究講技術。由於畢業設計的緣故,需要寫Java解析XML檔案。(說起畢業設計就想起坑爹的隊友,三個人的小組就我一個人在奮鬥。坑啊……)下面分享如何用Java解析XML。
名詞解釋
XML在維基百科是這樣解釋的(大家都知道是什麼,我就沒有深究的必要了吧)
可延伸標記語言 (XML)(英語:eXtensible Markup Language,簡稱:XML),是一種標記語言。
Java解析XML的方式有很多。有用PULL的,有用SAX的,這裡分享最原始的,用DOM解析。其它改日再論。
DOM是什嗎?
DOM,全稱Document Object Model,即“文件物件模型”。
DOM是一種用於XML文件物件模型,可用於直接存取XML文檔的各個部位。在DOM中,文檔被類比為樹狀,其中XML文法的每一個組成部分都表示一個節點,DOM允許使用者遍曆文檔樹,從父節點移動到子節點和兄弟節點。
XML原始檔案
先給一個XML檔案,當然你也可以將其擺在伺服器上面,這樣看上去比較酷。
View Code XML檔案
<?xml version="1.0" encoding="utf-8"?><students> <student id="1"> <name>張三</name> <phoneno>621380</phoneno> <login>true</login> </student> <student id="1"> <name>李四</name> <phoneno>641234</phoneno> <login>true</login> </student> <student id="1"> <name>王五</name> <phoneno>67890</phoneno> <login>false</login> </student></students>
本人將該檔案student.xml放在自己機器上面的iis上面。當瀏覽器訪問http://localhost/student.xml的時候即可以訪問到。
Object對象
根據XML的資料及類型建立一個類,類的成員和XML的屬性相對應,並且給類的成員產生get和set方法以及類的toString()方法方便顯示結果。以下是一個執行個體:
View Code Student類
package com.xml.domain;public class Student { private int id; private String name; private String phone; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public boolean isLogin() { return login; } public void setLogin(boolean login) { this.login = login; } private boolean login; @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", phone=" + phone + ", login=" + login + "]"; } }
解析方法
建立一個類(本人用例建立的是是DomService類),在類裡面編寫一個解析XML檔案的方法。該方法使用DOM技術解析資料並且將XML檔案轉換為一個List集合。詳細請看代碼。
1 //將XML轉換為對象 2 public List<Student> getStudents(InputStream inputStream) throws Exception { 3 List<Student> list = new ArrayList<Student>(); 4 // 建立一個Document解析工廠 5 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 6 DocumentBuilder builder = factory.newDocumentBuilder(); 7 // 將輸入資料流解析為Document 8 Document document = builder.parse(inputStream); 9 // 整個文檔就是一個節點文檔 所以該節點就是所有內容10 Element ele = document.getDocumentElement();11 NodeList nodeList = ele.getElementsByTagName("student"); //擷取所有student節點 並且進行遍曆12 for (int i = 0; i < nodeList.getLength(); i++) {13 Element ele2 = (Element) nodeList.item(i); //具體的一個student節點14 Student student = new Student();15 student.setId(Integer.parseInt(ele2.getAttribute("id")));16 //擷取student節點下面的所有子節點 並且進行遍曆17 NodeList nodeList2 = ele2.getChildNodes();18 for (int j = 0; j < nodeList2.getLength(); j++) {19 if (nodeList2.item(j).getNodeType() == Node.ELEMENT_NODE) { //如果該節點是元素節點20 if ("name".equals(nodeList2.item(j).getNodeName())) {21 student.setName(nodeList2.item(j).getFirstChild()22 .getNodeValue());23 } else if ("phoneno".equals(nodeList2.item(j).getNodeName())) {24 student.setPhone(nodeList2.item(j).getFirstChild()25 .getNodeValue());26 } else if ("login".equals(nodeList2.item(j).getNodeName())) {27 student.setLogin(Boolean.parseBoolean(nodeList2.item(j)28 .getFirstChild().getNodeValue()));29 }30 }31 }32 list.add(student); //添加到集合33 }34 return list;35 }
DOM解析要根據具體的XML結構進行代碼編寫。總體來說比較靈活而且比較容易理解。但是如果XML檔案深度比較大的話,DOM解析的效率就會大大地降低。因為DOM的解析會隨著深度而進行迴圈,多重迴圈的效率不高。所以不是很推薦,特別是XML很深的時候。
HTTP請求
由於本人將XML放在伺服器上面,下面也說說如果用Java代碼擷取XML檔案。我寫了下面一個方法。
View Code http要求方法
// path為地址路徑// 傳回值將以流的形式返回public static InputStream getXML(String path) { InputStream inputStream = null; try { URL url = new URL(path); if (url != null) { HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setConnectTimeout(3000); // 設定逾時時間為3秒 connection.setDoInput(true); connection.setRequestMethod("GET"); // 佈建要求方式 int code = connection.getResponseCode(); // 接受返回碼 if (200 == code) { // 返回碼為200為成功 inputStream = connection.getInputStream(); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return inputStream;}
下面我們就可以對伺服器進行XML請求並且對XML解析了。
測試結果
在Main方法中編寫
public static void main(String[] args) { // TODO Auto-generated method stub String path = "http://localhost/student.xml"; InputStream input = HttpUtils.getXML(path); DomService service = new DomService(); try { List<Student> list = service.getStudents(input); for (Student student : list) { System.out.println(student.toString()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }}
發布代碼,得到結果
Student [id=1, name=張三, phone=621380, login=true]
Student [id=1, name=李四, phone=641234, login=true]
Student [id=1, name=王五, phone=67890, login=false]
完整項目代碼下載:http://vdisk.weibo.com/s/uIkgX
------我是無聊的分割線-------
以上是鄙人學習DOM解析和資料轉送的過程。希望對您也能有所協助。