1. 程式人生 > >DOM與DOM4J對XML檔案的解析

DOM與DOM4J對XML檔案的解析

package com.freshbin.domtest.test;

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.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//建立一個DocumentBuilderFactory的物件
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

		try {
			//建立一個DocumentBuilder的物件
			DocumentBuilder db = dbf.newDocumentBuilder();
			//通過DocumentBuilder物件的parse方法載入book.xml檔案到當前專案下
			Document document = db.parse("freshbin/book.xml");
			//獲取所有book節點的集合
			NodeList bookList = document.getElementsByTagName("book");
			//通過NodeList的getLength()方法獲取bookList的長度
			System.out.println("一共有" + bookList.getLength() + "本書\n");
			
			//遍歷每一個book節點
			for(int i = 0; i < bookList.getLength(); i++) {
				System.out.println("========下面開始遍歷第" + (i+1) + "本書=====");
				//通過item()方法獲取一個book節點,nodelist的索引值從0開始
				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節點的子節點
				NodeList childNodes = book.getChildNodes();
				//遍歷childNodes獲取每個節點的節點名和節點值
				System.out.println("第" + (i+1) + "本書共有" + childNodes.getLength() + "個子節點");
				for(int k = 0; k < childNodes.getLength(); k++) {
					//區分出text型別的node以及element型別的node
					if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
						//獲取了element節點的節點名
						System.out.print("第" + (k+1) + "個節點的節點名"
							+	childNodes.item(k).getNodeName());
						//獲取了element節點的節點值,節點值其實看做是子節點,即比如<name>freshbin</name>,freshbin是name的子節點
//						System.out.println("--節點值是:" + childNodes.item(k).getFirstChild().getNodeValue());
						//第二種獲取值的方法
						System.out.println("--節點值是:" + childNodes.item(k).getTextContent());
					}

				}
				System.out.println("========結束遍歷第" + (i+1) + "本書=====\n");
			}
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

以上是DOM的方式解析,結果如下


然後是DOM4J的方式解析

package com.freshbin.dom4jtest.test;

import java.io.File;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class DOM4JTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//建立SAXReader的物件reader
		SAXReader reader = new SAXReader();

		try {
			//通過reader物件的read()方法載入book.xml檔案
			Document document = reader.read(new File("freshbin/book.xml"));
			//通過document物件獲取根節點bookStore
			Element bookStore = document.getRootElement();
			//通過Element物件的elementIterator方法獲取迭代器
			Iterator itr = bookStore.elementIterator();
			//遍歷迭代器,獲取根節點中的資訊
			while(itr.hasNext()) {
				System.out.println("==========開始遍歷某一本書=============");
				Element book = (Element)itr.next();
				//獲取book的屬性名以及屬性值
				List<Attribute> bookAttrs = book.attributes();
				for(Attribute attr : bookAttrs) {
					System.out.println("屬性名:" + attr.getName() + "--屬性值:" + attr.getStringValue());
				}
				Iterator itrBook = book.elementIterator();
				while(itrBook.hasNext()) {
					Element bookChild = (Element)itrBook.next();
					System.out.println("節點名:" + bookChild.getName() + "--節點值:" + bookChild.getStringValue());
				}
				System.out.println("==========結束遍歷某一本書=============\n");
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}