Java-Web DOM方式解析xml檔案

來源:互聯網
上載者:User

標籤:val   nodelist   需要   如何   構造   stat   技術分享   null   dex   

XML DOM 樹形結構:

DOM 節點

根據 DOM,XML 文檔中的每個成分都是一個節點

DOM 是這樣規定的:

  • 整個文檔是一個文檔節點
  • 每個 XML 元素是一個元素節點
  • 包含在 XML 元素中的文本是文本節點
  • 每一個 XML 屬性是一個屬性節點
  • 注釋是注釋節點
常用節點類型
節點類型 NodeType Named Constant nodeName 的傳回值 nodeValue 的傳回值
Element 1 ELEMENT_NODE element name null
Attr 2 ATTRIBUTE_NODE 屬性名稱 屬性值
Text 3 TEXT_NODE #text 節點名稱

 

 

  案例:

目標:解析xml檔案後,Java程式能夠得到xml檔案的所有資料

思考:如何在解析之後保留xml的結構資訊

xml文檔:

執行個體:

package Test;/** * 案例:運用DOM解析xml檔案,獲得xml檔案的所有資料 */import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class DOMDemo {    public static void main(String[] args) throws Exception {        /** 步驟一:建立一個DocumentBuilderFactory的對象         *     1.定義工廠 API,使應用程式能夠從 XML 文檔擷取產生 DOM 對象樹的解析器。         *  2. protected     DocumentBuilderFactory()         *                  用於阻止執行個體化的受保護構造方法         *  3. static DocumentBuilderFactory     newInstance()         *                  擷取 DocumentBuilderFactory 的新執行個體。         */        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();                /** 步驟二:建立一個DocumentBuilder的對象         *     1.protected     DocumentBuilder()         *                     受保護的構造方法         *  2.使其從 XML 文檔擷取 DOM 文檔執行個體。使用此類,應用程式員可以從 XML 擷取一個 Document。         */        DocumentBuilder db = dbf.newDocumentBuilder();                    /** 步驟三:通過DocumentBuilder對象的parse方法載入book.xml檔案到目前的目錄下         *  1.parse(File f)         *    將給定檔案的內容解析為一個 XML 文檔,並且返回一個新的 DOM Document 對象。         */        Document document = db.parse("books.xml");                /** 步驟四:擷取所有book節點的集合         *  1.getElementsByTagName():通過節點的名稱來擷取所有同名節點,         *    因為不只有一個節點,所以就把擷取的所有節點都存放在一個節點集合中。         */        NodeList booklist = document.getElementsByTagName("book");        System.out.println("一共有" + booklist.getLength() + "本書");                /** 步驟五:遍曆每一個book節點         *  1.Node     item(int index)         *    返回集合中的第 index 個項。         *  2.NamedNodeMap     getAttributes()         *    包含此節點的屬性的 NamedNodeMap(如果它是 Element);否則為 null。         */                for(int i = 0; i < booklist.getLength(); i++){                        // 前提:不知道book節點的id屬性有多少            System.out.println("===========下面開始遍曆第" + (i+1) + "本書的內容===========");            // 通過item方法擷取一個book節點            Node book = booklist.item(i);            // 擷取book節點的所有屬性集合            NamedNodeMap attrs = book.getAttributes();            System.out.println("第" + (i+1) + "本書共有" + attrs.getLength() + "個屬性");            // 遍曆book的屬性            for(int j = 0; j < attrs.getLength(); j++){                // 通過item方法擷取book節點的某一個屬性                Node attr = attrs.item(j);                // 擷取屬性名稱                System.out.print("屬性名稱:" + attr.getNodeName());                // 擷取屬性值                System.out.println("--屬性值:" + attr.getNodeValue());            }                        /*            // 前提:已經知道book節點有且只有一個id屬性            // 將book節點進行強制類型轉換,轉換成Element類型            Element ebook = (Element)booklist.item(i);            // 通過getAttribute("id")方法來擷取屬性值            String attrValue = ebook.getAttribute("id");            System.out.println("id屬性值為:" + attrValue);*/                        /** 步驟六:解析book節點的子節點             *  1.NodeList     getChildNodes()             *              包含此節點的所有子節點的 NodeList。             */            NodeList childNodes = book.getChildNodes();            // 遍曆childNodes擷取每個節點的節點名和節點值            System.out.println("第" + (i+1) + "本書共有" + childNodes.getLength() + "個子節點");            for(int k = 0; k < childNodes.getLength(); k++){                                /* 如果不對節點類型進行判斷                 * 遍曆book節點的子節點後會發現有9個子節點,但是我們唯寫了4個子節點                 * 輸出了5個#text節點,這是Text類型的節點。                 * 因為空白格也屬於子節點,所以也會i被遍曆出來。                 * */                // 區分出text類型的node以及element類型的node                if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){                    // 擷取element類型節點的節點名                    System.out.print("第" + (k+1) + "個節點的是" + childNodes.item(k).getNodeName() + ": ");                                        /* 當我們用childNodes.item(k).getNodeValue()這種方法擷取                     * element類型的節點的節點值時會返回空,因為他認為                     * <name>冰與火之歌</name>中“冰與火之歌”是<name>的子節點,                     * 所以返回<name>節點的值當然是null,因為它認為“冰與火之歌”是節點而不是內容。                     * 我們這時需要返回<name>節點的第一個子節點,再返回第一個子節點的值就可以了,                     * 或者用getTextContent()也可以解決,它會擷取所有子節點的節點值                     * */                    // System.out.println(childNodes.item(k).getFirstChild().getNodeValue());                    System.out.println(childNodes.item(k).getTextContent());                }                        }                    }        }}

運行結果:

一共有2本書===========下面開始遍曆第1本書的內容===========第1本書共有1個屬性屬性名稱:id--屬性值:1第1本書共有9個子節點第2個節點的是name: 冰與火之歌第4個節點的是author: 喬治馬丁第6個節點的是year: 2014第8個節點的是price: 89===========下面開始遍曆第2本書的內容===========第2本書共有1個屬性屬性名稱:id--屬性值:2第2本書共有9個子節點第2個節點的是name: 格林童話第4個節點的是year: 2004第6個節點的是price: 66第8個節點的是language: English

 

Java-Web DOM方式解析xml檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.