解析xml筆記

edagarli發表於2014-03-16
dom是解析xml的底層介面之一(另一種是sax)   
而jdom和dom4j則是基於底層api的更高階封裝    

dom是通用的,而jdom和dom4j則是面向java語言的   


DOM程式設計相對簡單,但是速度比較慢,佔用記憶體多 
SAX程式設計複雜一些,但是速度快,佔用記憶體少 


DOM4J 
    雖然 DOM4J 代表了完全獨立的開發結果,但最初,它是 JDOM 的一種智慧分支。它合併了許多超出基本 XML 文件表示的功能,包括整合的 XPath 支援、XML Schema 支援以及用於大文件或流化文件的基於事件的處理。它還提供了構建文件表示的選項,它通過 DOM4J API 和標準 DOM 介面具有並行訪問功能。從 2000 下半年開始,它就一直處於開發之中。
    為支援所有這些功能,DOM4J 使用介面和抽象基本類方法。DOM4J 大量使用了 API 中的 Collections 類,但是在許多情況下,它還提供一些替代方法以允許更好的效能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復雜的 API 的代價,但是它提供了比 JDOM 大得多的靈活性。
    在新增靈活性、XPath 整合和對大文件處理的目標時,DOM4J 的目標與 JDOM 是一樣的:針對 Java 開發者的易用性和直觀操作。它還致力於成為比 JDOM 更完整的解決方案,實現在本質上處理所有 Java/XML 問題的目標。在完成該目標時,它比 JDOM 更少強調防止不正確的應用程式行為。
    DOM4J 是一個非常非常優秀的Java XML API,具有效能優異、功能強大和極端易用使用的特點,同時它也是一個開放原始碼的軟體。如今你可以看到越來越多的 Java 軟體都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。


package test;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.OutputFormat;

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

public class TestWrite {

	public void WriteXml() {
		//文件物件
		Document document = DocumentHelper.createDocument();
		//根節點
		Element root = document.addElement("books");
		//加屬性
		root.addAttribute("type", "小說");
		//加註釋
		root.addComment("書店");
		
		//子元素
		Element book = root.addElement("book");
		book.addAttribute("price", "56.5");
		Element title = book.addElement("title");
		title.setText("aaaaa");
		//子元素
		Element book1 = root.addElement("book");
		book1.addAttribute("price", "66.5");
		Element title1 = book1.addElement("title");
		title1.setText("bbbbb");
		//子元素
		Element book2 = root.addElement("book");
		book2.addAttribute("price", "76.5");
		Element title2 = book2.addElement("title");
		title2.setText("ccccc");

		// 設定字型
		OutputFormat format = OutputFormat.createCompactFormat();
		format.setEncoding("GBK");
		try {
			XMLWriter output = new XMLWriter(new FileWriter(new File(
					"books.xml")), format);
			output.write(document);
			output.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void ReadXml() {
		SAXReader saxReader = new SAXReader();
		try {
			Document document = saxReader.read("books.xml");
			// 1查詢屬性
			List list = document.selectNodes("//book/@price");// 1查詢屬性
																// 獲取//book/@price的值的集合
			for (int i = 0; i < list.size(); i++) {
				Attribute attr = (Attribute) list.get(i);
				if (Float.parseFloat(attr.getValue()) > 60)
					attr.setValue("1000");// 設定新值
			}
			
			// 2查詢元素
			List list1 = document.selectNodes("//title");// 2查詢元素book
			for (int j = 0; j < list1.size(); j++) {
				Element elem = (Element) list1.get(j);
				//elem.setText("mmmmmmmmmm");

			}
		
			//3獲取價格等於1000的書的標題
			List list2 = document.selectNodes("//book[@price='1000']/title");
			Iterator iter = list2.iterator();
			while (iter.hasNext()) {
			    Element el = (Element) iter.next();
			    System.out.println(el.getText());
			   }

			
			//4 設定字型
			OutputFormat format = OutputFormat.createCompactFormat();// 縮排
			format.setEncoding("GBK");// 字符集

			XMLWriter output = new XMLWriter(new FileWriter(new File(
					"books.xml")), format);
			output.write(document);
			output.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		TestWrite testwrite = new TestWrite();
		testwrite.ReadXml();
	}
}







相關文章