DOM4J即Document Object Model for Java使用java技術以文檔方式解析xml數據的模型。
DOM4J是開源組織提供的一個免費的、強大的XML解析工具,如果開發者需要在項目中使用那么需要下載并引入jar包。
dom4j is an Open Source XML framework for Java. dom4j allows you to read, write, navigate, create and modify XML documents. dom4j integrates with DOM and SAX and is seamlessly integrated with full XPath support
下載:http://sourceforge.net/PRojects/dom4j
引入:dom4j-1.6.1.jar (核心包)、 jaxen-1.1-beta-6.jar(Xpath支持包)
1 如何去學習一個開源的工具包?
一般的開源工具中都提供了免費的API文件,開發者可以參考該文檔。
DOM4J提供的文檔中有一個免費教程可以直接使用。à Quickstart
2 開始解析
1. 準備需要解析的xml文件linkmans.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?><linkmans> <linkman> <name>jack</name> <phone>18663243245</phone> <email>jack@163.com</email> </linkman> <linkman> <name>張三</name> <phone>1353243247</phone> <email>zs@126.com</email> </linkman></linkmans>
2. 獲取解析器// 2.獲取解析器 public static SAXReader getReader(){ return new SAXReader(); }3. 獲取解析對象// 3.獲取解析好的文檔對象 public static Document getDocument(File file)throws Exception{ // 3.1獲取解析器 SAXReader reader = getReader(); // 3.2解析文檔 Document doc = reader.read(file); return doc; }4. 獲取根元素節點 // 4.獲取根元素 public static void getRoot(File file)throws Exception{ // 4.1獲取解析器 SAXReader reader = getReader(); // 4.2解析文檔 Document doc = reader.read(file); // 4.3獲取根元素 Element root = doc.getRootElement(); System.out.println(root.getName()); }5. 獲取指定的其他的元素獲取其他元素的時候默認需要從根節點開始查找。 // 5.獲取指定的元素 public static void getElement(File file) throws Exception { // 5.1獲取解析器 SAXReader reader = getReader(); // 5.2解析文檔 Document doc = reader.read(file); // 5.3獲取根元素 Element root = doc.getRootElement(); // 5.4獲取所有的linkman List list = root.elements("linkman"); Iterator it = list.iterator(); // 5.5循環遍歷節點 while (it.hasNext()) { Element ele = (Element) it.next(); System.out.println(ele.getName()); } System.out.println("---------------"); // 簡化 for (Iterator i = root.elementIterator(); i.hasNext();) { Element element = (Element) i.next(); System.out.println(element.getName()); } // 5.6獲取第二個linkman的名字 Element linkman2 = (Element) list.get(1); String name = linkman2.element("name").getText(); System.out.println(name); }6. 添加元素// 6. 添加元素 public static Document addElement(File file)throws Exception{ // 6.1獲取解析器 SAXReader reader = getReader(); // 6.2解析文檔 Document doc = reader.read(file); // 6.3獲取根元素 Element root = doc.getRootElement(); // 6.4創建新元素 Element new_linkman = DocumentHelper.createElement("linkman"); Element new_name = DocumentHelper.createElement("name"); Element new_phone = DocumentHelper.createElement("phone"); Element new_email = DocumentHelper.createElement("email"); new_name.setText("焦寧波"); new_phone.setText("186xxxxxxxxx"); new_email.setText("jnb@itcast.cn"); // 6.5建立關系 new_linkman.add(new_name); new_linkman.add(new_phone); new_linkman.add(new_email); root.add(new_linkman); return doc; }7. 修改的document需要進行持久化的操作,因此需要提供以下的方法// 提供一個工具方法將內存中的Document寫入XML文件 public static void writeDocument2XML(Document doc, File file)throws Exception{ // 創建創建一個轉換對象 XMLWriter writer = new XMLWriter( // 可以解決輸入的數據時中文的亂碼問題new OutputStreamWriter(new FileOutputStream(file),"UTF-8")); // 將doc寫入指定文件 writer.write(doc); // 釋放資源 writer.close(); }8. 修改元素 // 8. 修改元素 public static Document modifyElement(File file) throws Exception { // 8.1獲取解析器 SAXReader reader = getReader(); // 8.2解析文檔 Document doc = reader.read(file); // 8.3獲取根元素 Element root = doc.getRootElement(); // 8.4直接獲取第二個linkman的name Element name = ((Element)root.elements("linkman").get(1)).element("name"); name.setText("李四"); return doc; }9. 刪除元素// 9. 刪除元素 public static Document removeAll(File file)throws Exception{ // 9.1獲取解析器 SAXReader reader = getReader(); // 9.2解析文檔 Document doc = reader.read(file); // 9.3獲取根元素 Element root = doc.getRootElement(); // 9.4獲取所有的linkman List list = root.elements("linkman"); // 9.4循環斷絕關系 for(Object temp :list){ // 轉型 Element linkman = (Element)temp; // 斷絕關系 root.remove(linkman); } return doc; }10. 屬性的操作 // 10. 屬性操作 public static Document optionAttribute(File file)throws Exception{ // 10.1獲取解析器 SAXReader reader = getReader(); // 10.2解析文檔 Document doc = reader.read(file); // 10.3獲取根元素 Element root = doc.getRootElement(); // 10.4獲取所有的linkman List list = root.elements("linkman"); // 10.4循環添加屬性 int count = 0; for(Object temp :list){ // 轉型 Element linkman = (Element)temp; // 添加屬性 linkman.add(DocumentHelper.createAttribute(linkman, "id", "00"+(count+1))); count++; } // 10.5獲取焦寧波的id Element linkman3 = (Element) list.get(2); String value = linkman3.attribute("id").getText(); System.out.println(value); // 10.6修改屬性 linkman3.attribute("id").setText("007"); // 10.7刪除屬性 linkman3.remove(linkman3.attribute("id")); return doc; } 問題:閱讀以下的代碼,并說出以下的代碼的缺點。// 獲取linkman中的linkman public static void findQuestion(File file)throws Exception{ // 10.1獲取解析器 SAXReader reader = getReader(); // 10.2解析文檔 Document doc = reader.read(file); Element inner_name = doc.getRootElement() // 獲取根元素.element("linkman") // 獲取第一個linkman元素.element("linkman") // 獲取第一個linkman中的第一個linkman元素.element("name"); // 獲取上面的name元素 System.out.println(inner_name.getText()); }發現如果需要遍歷一個比較深的元素節點,那么需要多次的element()。
如:存儲一個自己的隱私文件需要建立100個文件夾嗎?
那么如果路徑比較長需要進行路徑訪問的方式的優化。
如果在DOM4J進行解析查找元素可以使用類似Windows中的路徑模式來查找元素那么就變得簡單且高效。
如果使用xpath代碼可以簡化如下:
// 使用xpath解決以上的問題 public static void findAnswer(File file)throws Exception{ // 10.1獲取解析器 SAXReader reader = getReader(); // 10.2解析文檔 Document doc = reader.read(file); Element name = (Element) doc.selectSingleNode("/linkmans/linkman[1]/linkman/name"); System.out.println(name.getText()); }以上的代碼可以通過xpath快速的查找指定的元素節點,因此以后在實際的開發中我們如果需要解析XML數據那么就需要DOM4J+Xpath進行聯合的處理。
新聞熱點
疑難解答