標籤: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檔案