• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • XML學習---XML文檔解析

    Java對XML文檔進行解析

    解析XML的幾種方式的概述;
    這里寫圖片描述

    JAXP(JavaApi for Xml Programming) – sun公司的一套操作XML的API.

    • DOM解析-一次性的將數據全部裝入內存。
    • SAX解析-邊讀取邊解析

    Dom4j(Document For Java)-第三方開源,是從jdom分裂出來的解析技術。目前jdom已經完全被dom4j替代。

    • jDom – Dom4j的前身。
    • Dom4j在性能和速度上都比sun公司的要快,而且支持Xpath快速查找,目前像Spring,Hibernate這些大型的框架,都是用的dom4j.

    StAX – JDK1.6新特性,做為JAXP的新成員已經集成在了JDK6當中

    DOM解析學習實例:
    主要用來解析下面這個文檔:

    <?xml version="1.0" encoding="UTF-8"?>
    <users>
    <user id="A001">
        <name>Jack</name>
        <age>22</age>
      </user>
      <user id="A002">
        <name>張三</name>
        <age>24</age>
      </user>
    </users>

    第一步:是獲取DOM 對象。 (w3c的document)

    // w3c僅僅提供標準、java 提供創建方法
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse("./xml/users.xml");

    第二部:獲取DOM下面的節點:

    Node root = dom.getFirstChild();
    System.out.println("NodeName:"+root.getNodeName());
    System.out.println("---------------------");

    演示結果:成功拿到users節點
    這里寫圖片描述

    看看他有哪些子節點: 應該是 兩個 user 才對

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse(new File("./xml/users.xml"));
    
    Node root = dom.getFirstChild();
    System.out.println("NodeName:"+root.getNodeName());
    System.out.println("---------------------");
    NodeList list = root.getChildNodes();
    for(int i=0;i<list.getLength();i++){
        System.out.println(list.item(i).getNodeName());
    }

    演示結果: 換行符也是子節點!!!
    這里寫圖片描述

    接下來拿name標簽的值
    方式一:通過孩子節點

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document dom = db.parse(new File("./xml/users.xml"));
    
    Node root = dom.getFirstChild();
    System.out.println("NodeName:"+root.getNodeName());
    System.out.println("---------------------");
    NodeList list = root.getChildNodes();
    for(int i=0;i<list.getLength();i++){
        System.out.println(list.item(i).getNodeName());
    }
    System.out.println("---------------------");
    //不建議采用的方式(理由見后面的講解)---Node.getChildNodes()
    NodeList nodeList = root.getChildNodes();
    System.out.println("節點數:"+nodeList.getLength());
    Node node = nodeList.item(1);
    System.out.println("NodeName:"+node.getNodeName());
    Node nameNode = node.getChildNodes().item(1);
    String name = nameNode.getTextContent();
    System.out.println("name="+name);

    演示結果:
    這里寫圖片描述

    方式二:通過標簽明

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document dom = db.parse(new File("./xml/users.xml"));
    
        Node root = dom.getFirstChild();
        System.out.println("NodeName:"+root.getNodeName());
        System.out.println("---------------------");
    
        //采用建議的方式---Element中的getElementsByTagName(String name)
        //為了使用Element中的方法,必須得強轉成Element類型
        Element eRoot = (Element)root;
        NodeList userList= eRoot.getElementsByTagName("user");
        Element eUser1 = (Element) userList.item(0);
        NodeList nameList = eUser1.getElementsByTagName("name");
        Node nameNode = nameList.item(0);
        String name = nameNode.getTextContent();
        System.out.println(name);

    演示結果:
    這里寫圖片描述

    同樣的也可以拿到年齡

    DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document dom = db.parse(“./xml/users.xml”);
    Element root = (Element) dom.getFirstChild();
    Element eUser = (Element) root.getElementsByTagName(“user”).item(1);
    Node eName=eUser.getElementsByTagName(“age”).item(0);
    String strAge = eName.getTextContent();
    System.out.println(“age=”+strAge);

    演示結果:
    這里寫圖片描述

    整片學習代碼:

    package cn.hncu.jaxp.dom;
    
    import java.io.File;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.junit.Test;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    /*
     * JDK中有兩個專用于進行dom編程的包:
     * 1) org.w3c.dom  ----w3c是制定標準
     * 2) javax.xml.parsers ----sun公司開發出來給我們解析用的
     * 
     * 
     * 入口: Document接口(來自w3c,org.w3c.dom包)   --> 要用工廠方法獲得該dom對象 ---工廠方法來自sun公司(javax.xml.parsers包)
     * 
     */
    public class DomDemo {
        @Test
        public void getDom() throws Exception{
            //獲取dom對象
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document dom = db.parse("./xml/users.xml");
            System.out.println(dom);
        }
    
    
        //需求:讀取第一個<user>節點中的<name>值
        @Test
        public void getName() throws Exception{
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document dom = db.parse(new File("./xml/users.xml"));
    
            Node root = dom.getFirstChild();
            System.out.println("NodeName:"+root.getNodeName());
            System.out.println("---------------------");
    
            //不建議采用的方式(理由見后面的講解)---Node.getChildNodes()
            NodeList nodeList = root.getChildNodes();
            System.out.println("節點數:"+nodeList.getLength());
            Node node = nodeList.item(1);
            System.out.println("NodeName:"+node.getNodeName());
            Node nameNode = node.getChildNodes().item(1);
            String name = nameNode.getTextContent();
            System.out.println("name="+name);
        }
    
        /*
         * 以后要遍歷文檔,最好的選擇方式是:
         *   采用Element中的getElementsByTagName(String name),
         *   返回類型為:NodeList, 獲取當前元素下面的所有對應標簽的那些子元素(
         *   僅僅是標簽節點---能夠去除文本內容尤其是空白符的干擾)。
         * 
         * 建議不要采用如下兩種方式:
         * 1)通過Node中的 getChildNodes(),返回類型為:NodeList, 獲取當前節點的所有
         * 子節點(包括文本內容和標簽節點)----不選擇的理由:文本內容尤其是空白符也是其中的孩子節點,會產生干擾
         * 2)通過Document的getElementById(String elementId), 返回Element節點,
         * 這種方式在browse-dom中用起來是非常方便的,但在Java-dom中必須得給
         * DocumentBuilderFactory對象設置schema
         * 
         */
    
        //需求:讀取第一個<user>節點中的<name>值
            @Test  //OOOOOOKKKKKK
            public void getName2() throws Exception{
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                Document dom = db.parse(new File("./xml/users.xml"));
    
                Node root = dom.getFirstChild();
                System.out.println("NodeName:"+root.getNodeName());
                System.out.println("---------------------");
    
                //采用建議的方式---Element中的getElementsByTagName(String name)
                //為了使用Element中的方法,必須得強轉成Element類型
                Element eRoot = (Element)root;
                NodeList userList= eRoot.getElementsByTagName("user");
                Element eUser1 = (Element) userList.item(0);
                NodeList nameList = eUser1.getElementsByTagName("name");
                Node nameNode = nameList.item(0);
                String name = nameNode.getTextContent();
                System.out.println(name);
            }
    
            //需求:讀取第二個<user>節點中的<age>值
            @Test  //OOOOOOKKKKKK
            public void getAge() throws Exception{
                DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                Document dom = db.parse("./xml/users.xml");
                Element root = (Element) dom.getFirstChild();
                Element eUser = (Element) root.getElementsByTagName("user").item(1);
                Node eName=eUser.getElementsByTagName("age").item(0);
                String strAge = eName.getTextContent();
                System.out.println("age="+strAge);
            }
    
    }
    
    版權聲明:本文為weixin_37720904原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_37720904/article/details/72639279

    智能推薦

    java 進行xml文檔解析

    這份是對于postman請求時候,進行對于報文解析 圖一為報文發送的內容 引入相關依賴 調用這個方法后,所有的尖括號的值都已經存在,直接使用map.get 獲取對應的key即可獲取相關的value,進行封裝對象操作: 獲取所有的map的值...

    XML文檔

    注:本內容為個人拉勾教育大數據訓練營學習課程筆記 XML 基本概念 XML即可擴展標記語言(Extensible Markup Language) W3C在1998年2月發布1.0版本,2004年2月又發布1.1版本,但因為1.1版本不能向下兼容1.0版 本,所以1.1沒有人用 同時,在2004年2月W3C又發布了1.0版本的第三版。我們要學習的還是 1.0版本 ! 特點 可擴展的, 標簽都是自定...

    java用DOM方法解析xml文檔

    步驟: 1、創建DocumentBuliderFactory對象 2、創建DocumentBuilder對象(方法會拋出異常) 3、創建Document對象,用parse方法加載要解析的xml文件 這樣DOM解析xml文檔的準備工作就完成啦 下面是一些常用的節點類型的介紹 DOM操作中常用的對象: 1、節點對象:Node(包含元素節點,屬性節點,文本節點) getAttributes():獲取節點...

    XML學習---XML文檔類型定義~DTD學習

    寫這篇博客主要是為了更加深刻的鞏固學的DTD。同時也是為了以后復習. 主要學習DTD的以下幾部分 DTD的作用 DTD的元素 DTD的屬性 DTD的實體 DTD的使用 DTD的作用 我們在學習XML的時候知道XML是可拓展語言,所以呢,寫XML文檔的時候我們可以任意寫,xml是用來共享、存儲數據。如果我們大家都任意寫XML文檔,那么就不好互相共享數據。所以就需要一個規范,來控制我們寫的XML文檔,...

    猜你喜歡

    XML解析---JAVAEE學習之路

    解析XML通過JAXP的DOM(DEMO) 廢話不多說,自行測試跟看1.6以上的JDK API 目錄結構: XML文件內容: XML代碼: 代碼塊:...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡