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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

java學(xué)習(xí)筆記XML解析技術(shù)(5)

2019-11-14 23:16:14
字體:
供稿:網(wǎng)友
java學(xué)習(xí)筆記xml解析技術(shù)(5)JAXP技術(shù)

JAXP即Java Api for Xml PRocessing該API主要是SUN提供的用于解析XML數(shù)據(jù)的一整套解決方案,主要包含了DOM和SAX解析技術(shù)。大家可以參見SUN的以下兩個(gè)包:

javax.xml.parsers.* à主要存儲的是解析器

org.w3c.dom.*或org.w3c.sax.* à主要存儲的是DOM解析或SAX解析需要的API

DOM解析主要采用DOM樹的方式進(jìn)行XML的數(shù)據(jù)解析。如:JavaScript中的DOM操作

SAX解析主要采用事件的方式進(jìn)行XML的數(shù)據(jù)解析。如:Javascript中的事件機(jī)制

XML解析原理
  1. 編寫需要解析的XML文件
  2. 獲取相應(yīng)的XML解析器對象
  3. 使用API獲取數(shù)據(jù)
  4. 返回?cái)?shù)據(jù)給開發(fā)者
DOM解析

DOM解析采用的是DOM樹的方式進(jìn)行解析。

  1. 準(zhǔn)備要解析user.xml文件
<?xml version="1.0" encoding="UTF-8"?><!-- 1. 編寫要解析的XML文件 --><users></users>
2.    獲取解析器// 2. 提供獲取解析器的方法    public static DocumentBuilder getParser()throws Exception{        // 2.1  創(chuàng)建工廠類對象        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        // 2.2 獲取解析器對象        DocumentBuilder parser = factory.newDocumentBuilder();        return parser;    }
3. 獲取解析的DOM樹對象// 3. 提供獲取DOM數(shù)據(jù)的方法    public static Document getDOM(File file)throws Exception{        // 3.1 獲取解析器        DocumentBuilder parser = getParser();        // 3.2解析數(shù)據(jù)        Document dom = parser.parse(file);        return dom;    }
4. 獲取根元素// 4. 提供解析根元素的數(shù)據(jù)的方法    public static void getRoot(File file)throws Exception{        // 4.1 獲取DOM樹        Document dom = getDOM(file);        // 4.2遍歷dom樹找根元素        Node node = dom.getElementsByTagName("users").item(0);        // 4.3輸出根元素的名        System.out.println(node.getNodeName());    }
5. 通過關(guān)系獲取根元素// 4. 提供解析根元素的數(shù)據(jù)的方法    public static void getRoot(File file)throws Exception{        // 4.1 獲取DOM樹        Document dom = getDOM(file);        // 4.2遍歷dom樹找根元素        Node node = dom.getElementsByTagName("users").item(0);        // 4.3輸出根元素的名        System.out.println(node.getNodeName());        // 4.4根據(jù)節(jié)點(diǎn)直接的關(guān)系獲取根元素        NodeList list = dom.getChildNodes();        Node root = list.item(0);        System.out.println(root.getNodeName());        root = dom.getFirstChild();        System.out.println(root.getNodeName());        root = dom.getLastChild();        System.out.println(root.getNodeName());    }
6. 添加元素// 5. 添加一個(gè)user節(jié)點(diǎn)    public static Document addElement(File file)throws Exception{        // 5.1獲取DOM樹        Document dom = getDOM(file);        // 5.2創(chuàng)建user元素        Element user = dom.createElement("user");        Element name = dom.createElement("name");        Element age = dom.createElement("age");        Element address = dom.createElement("address");                name.setTextContent("焦寧波");        age.setTextContent("28");        address.setTextContent("天河區(qū)");        // 5.3建立關(guān)系        Element root = (Element) dom.getFirstChild();        user.appendChild(name);        user.appendChild(age);        user.appendChild(address);        root.appendChild(user);        // 5.4返回修改后的DOM樹對象        return dom;    }
7. 為了讓內(nèi)存中的修改的DOM樹持久化到磁盤文件需要定義以下方法// 提供一個(gè)工具方法將內(nèi)存中的DOM樹存儲到磁盤的指定文件中    public static void writeDOM2XML(Document dom,File file)throws Exception{        // 1.獲取轉(zhuǎn)換器的工廠類對象        TransformerFactory factory = TransformerFactory.newInstance();        // 2.獲取轉(zhuǎn)換器對象        Transformer trans = factory.newTransformer();        // 3.轉(zhuǎn)換        trans.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(file)));    }
8. 修改元素    // 6. 修改第二個(gè)user的年齡為30歲    public static Document modifyElement(File file)throws Exception{        // 6.1獲取DOM樹        Document dom = getDOM(file);        // 6.2獲取第二個(gè)age元素        Node age2 = dom.getElementsByTagName("age").item(1);        // 6.3設(shè)置文本值        age2.setTextContent("30");        return dom;    }
9. 刪除元素// 7. 刪除第一個(gè)user節(jié)點(diǎn)    public static Document removeElement(File file)throws Exception{        // 7.1獲取DOM樹        Document dom = getDOM(file);        // 7.2獲取user的父親        Node users = dom.getFirstChild();        // 7.2獲取需要斷絕關(guān)系的孩子節(jié)點(diǎn)        Node user1 = dom.getElementsByTagName("user").item(0);        // 7.3斷絕關(guān)系        users.removeChild(user1);        return dom;
10. 加強(qiáng)使用關(guān)系獲取元素// 8. 使用關(guān)系獲取節(jié)點(diǎn)    public static void searchElement(File file)throws Exception{        // 8.1獲取DOM樹        Document dom = getDOM(file);        // 8.2獲取第二個(gè)user的所有的子元素并輸入元素名        Element user2 = (Element) dom.getElementsByTagName("user").item(1);        // 8.3獲取所有的兒子        NodeList list = user2.getChildNodes();        // 8.4遍歷所有的孩子        for(int i = 0;i<list.getLength();i++){            Node node = list.item(i);            System.out.println(node.getNodeName());        }        // 8.5獲取第二個(gè)user的address元素        Element address2 = (Element) list.item(2);        System.out.println(address2.getNodeName());        Node age2 = address2.getPreviousSibling();        System.out.println(age2.getNodeName());                Element name2 = (Element) list.item(0);        System.out.println(name2.getNodeName());        age2 = name2.getNextSibling();        System.out.println(age2.getNodeName());            }
11. 屬性的操作// 9. 屬性操作    public static Document optionAttribute(File file)throws Exception{        // 9.1獲取DOM樹        Document dom = getDOM(file);        // 9.2獲取所有的user元素        NodeList list = dom.getElementsByTagName("user");        // 9.3遍歷節(jié)點(diǎn)        for (int i = 0; i < list.getLength(); i++) {            Element user = (Element)list.item(i);            // 添加屬性            user.setAttribute("id", "00"+(i+1));        }        // 9.4 獲取屬性        Element user2 = (Element) list.item(1);        String value = user2.getAttribute("id");        System.out.println(value);        // 9.5修改屬性        user2.setAttribute("id", "007");        // 9.5刪除屬性        user2.removeAttribute("id");        return dom;    }總結(jié):在實(shí)際的項(xiàng)目開發(fā)中我們經(jīng)常遇到的XML數(shù)據(jù)時(shí)比較大的,如果使用DOM進(jìn)行數(shù)據(jù)的解析,那么首先在內(nèi)存中會(huì)形成一個(gè)DOM樹結(jié)構(gòu)。因此容易導(dǎo)致內(nèi)存的一個(gè)溢出。所以不建議大家使用DOM解析進(jìn)行操作較大的XML數(shù)據(jù)。如果只是需要進(jìn)行XML文件的數(shù)據(jù)獲取,那么推薦使用SAX解析。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 交口县| 天水市| 博爱县| 清水河县| 张家口市| 新绛县| 商丘市| 金川县| 晋城| 漠河县| 大连市| 大安市| 财经| 成都市| 永城市| 财经| 积石山| 普兰店市| 延吉市| 福安市| 普兰店市| 板桥市| 交城县| 肇源县| 明水县| 满城县| 稷山县| 利川市| 河池市| 泸定县| 赤峰市| 清苑县| 辽阳市| 龙川县| 宾川县| 曲周县| 塔城市| 抚州市| 固镇县| 太谷县| 小金县|