国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java學習筆記DOM4J解析(7)

2019-11-14 23:21:04
字體:
來源:轉載
供稿:網友
java學習筆記DOM4J解析(7)

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進行聯合的處理。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延川县| 池州市| 永济市| 吉林市| 南汇区| 宝山区| 海门市| 贡嘎县| 澜沧| 雷山县| 尚志市| 东阿县| 正阳县| 泰州市| 嘉义县| 苍梧县| 高安市| 石泉县| 苍南县| 平塘县| 湘西| 青神县| 时尚| 克什克腾旗| 平阴县| 边坝县| 嘉义市| 南郑县| 年辖:市辖区| 广昌县| 永仁县| 耒阳市| 浮梁县| 深水埗区| 攀枝花市| 西丰县| 板桥市| 盐山县| 化隆| 板桥市| 韶关市|