[Java]XML資料的請求和DOM技術解析

來源:互聯網
上載者:User

 

剛剛看到一條微博

今天距離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解析和資料轉送的過程。希望對您也能有所協助。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.