• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 通過DOM方式解析xml

    簡述:XML 指可擴展標記語言(eXtensible Markup Language)。
    XML 被設計用來傳輸和存儲數據。
    XML 很重要,也很容易學習。

    什么是xml?

    • XML 指可擴展標記語言(EXtensible Markup Language)。
    • XML 是一種很像HTML的標記語言。
    • XML 的設計宗旨是傳輸數據,而不是顯示數據。
    • XML 標簽沒有被預定義。您需要自行定義標簽。
    • XML 被設計為具有自我描述性。
    • XML 是 W3C 的推薦標準。

    XML和HTML之間的差異
    XML 不是 HTML 的替代。
    XML 和 HTML 為不同的目的而設計:

    • XML 被設計用來傳輸和存儲數據,其焦點是數據的內容。
    • HTML 被設計用來顯示數據,其焦點是數據的外觀。

    HTML 旨在顯示信息,而 XML 旨在傳輸信息。

    通過XML可以自己發明標簽
    例:

    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>

    上面實例中的標簽沒有在任何 XML 標準中定義過(比如 <to><from>)。這些標簽是由 XML 文檔的創作者發明的。
    這是因為 XML 語言沒有預定義的標簽。
    HTML 中使用的標簽都是預定義的。HTML 文檔只能使用在 HTML 標準中定義過的標簽(如 <p><h1> 等等)。
    XML 允許創作者定義自己的標簽和自己的文檔結構。

    DOM解析
    DOM的全稱是Document Object Model,也即文檔對象模型。在應用程序中,基于DOM的XML分析器將一個XML文檔轉換成一個對象模型的集合(通常稱DOM樹),應用程序正是通過對這個對象模型的操作,來實現對XML文檔數據的操作。通過DOM接口,應用程序可以在任何時候訪問XML文檔中的任何一部分數據,因此,這種利用DOM接口的機制也被稱作隨機訪問機制。

      DOM接口提供了一種通過分層對象模型來訪問XML文檔信息的方式,這些分層對象模型依據XML的文檔結構形成了一棵節點樹。無論XML文檔中所描述的是什么類型的信息,即便是制表數據、項目列表或一個文檔,利用DOM所生成的模型都是節點樹的形式。也就是說,DOM強制使用樹模型來訪問XML文檔中的信息。由于XML本質上就是一種分層結構,所以這種描述方法是相當有效的。

      DOM樹所提供的隨機訪問方式給應用程序的開發帶來了很大的靈活性,它可以任意地控制整個XML文檔中的內容。然而,由于DOM分析器把整個XML文檔轉化成DOM樹放在了內存中,因此,當文檔比較大或者結構比較復雜時,對內存的需求就比較高。而且,對于結構復雜的樹的遍歷也是一項耗時的操作。所以,DOM分析器對機器性能的要求比較高,實現效率不十分理想。不過,由于DOM分析器所采用的樹結構的思想與XML文檔的結構相吻合,同時鑒于隨機訪問所帶來的方便,因此,DOM分析器還是有很廣泛的使用價值的。

        優點:

          1、形成了樹結構,有助于更好的理解、掌握,且代碼容易編寫。

          2、解析過程中,樹結構保存在內存中,方便修改。

        缺點:

          1、由于文件是一次性讀取,所以對內存的耗費比較大。

          2、如果XML文件比較大,容易影響解析性能且可能會造成內存溢出。

    1.首先使用文本文檔新建一個xml文件(注意編碼格式)
    xml代碼如下:

    <?xml version='1.0' encoding='UTF-8' ?>
    <root>
    <hang>
    <產品唯一ID>aab產品唯一ID</產品唯一ID>
    <通用名>aa通用名</通用名>
    <商品名>aa商品名</商品名>
    <劑型>aa劑型</劑型>
    <批準文號>aa批準文號</批準文號>
    <規格>aa規格</規格>
    <包裝說明>aa包裝說明</包裝說明>
    <包裝單位>aa包裝單位</包裝單位>
    <生產企業>aa生產企業</生產企業>
    <大包裝轉換比>aa大包裝轉換比</大包裝轉換比>
    <中包裝轉換比>aa中包裝轉換比</中包裝轉換比>
    <備注>aa備注</備注>
    <庫存>aa庫存</庫存>
    <供應價>aa供應價</供應價>
    <是否上架>aa是否上架</是否上架>
    </hang>
    <hang>
    <產品唯一ID>a121</產品唯一ID>
    <通用名>b12</通用名>
    <商品名>c231</商品名>
    <劑型>dewrwer</劑型>
    <批準文號>e324324</批準文號>
    <規格>f45645</規格>
    <包裝說明>g4543</包裝說明>
    <包裝單位>hq324e2</包裝單位>
    <生產企業>i76</生產企業>
    <大包裝轉換比>j453</大包裝轉換比>
    <中包裝轉換比>k4r43r</中包裝轉換比>
    <備注>le4tr4</備注>
    <庫存>mq3e2</庫存>
    <供應價>nefrw</供應價>
    <是否上架>o56</是否上架>
    </hang>
    </root>
    

    2.通過java編寫DOM解析程序
    java源代碼:

    import java.io.IOException;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.NamedNodeMap;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    
    public class DOMTest {
         public static void main(String[] args) {           
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();//創建一個DocumentBuilderFactory的對象
                //創建一個DocumentBuilder的對象
                try {               
                    DocumentBuilder db = dbf.newDocumentBuilder();//創建DocumentBuilder對象             
                    Document document = db.parse("F://123.xml");//通過DocumentBuilder對象的parser方法加載123.xml文件到當前項目下             
                    NodeList bookList = document.getElementsByTagName("hang");//獲取所有book節點的集合              
                    System.out.println("一共有" + bookList.getLength() + "個產品"); //通過nodelist的getLength()方法可以獲取bookList的長度             
                    for (int i = 0; i < bookList.getLength(); i++) {//遍歷每一個book節點
                        System.out.println("=================下面開始遍歷第" + (i + 1) + "個產品的內容=================");                  
                        Node book = bookList.item(i); //通過 item(i)方法 獲取一個book節點,nodelist的索引值從0開始                    
                        NamedNodeMap attrs = book.getAttributes();//獲取book節點的所有屬性集合
                        System.out.println("第 " + (i + 1) + "個產品共有" + attrs.getLength() + "個屬性");                   
                        for (int j = 0; j < attrs.getLength(); j++) {//遍歷hang的屬性                        
                            Node attr = attrs.item(j);//通過item(index)方法獲取hang節點的某一個屬性                       
                            System.out.print("屬性名:" + attr.getNodeName());//獲取屬性名                       
                            System.out.println("--屬性值" + attr.getNodeValue());//獲取屬性值
                        }
    
                        NodeList childNodes = book.getChildNodes(); //解析hang節點的子節點                  
                        System.out.println("第" + (i+1) + "個產品共有" + 
                        childNodes.getLength() + "個子節點");//遍歷childNodes獲取每個節點的節點名和節點值
                        for (int k = 0; k < childNodes.getLength(); k++) {                      
                            if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {//區分出text類型的node以及element類型的node                            
                                System.out.print("第" + (k + 1) + "個節點的節點名:" //獲取了element類型節點的節點名
                                + childNodes.item(k).getNodeName());                           
                                System.out.println("--節點值是:" + childNodes.item(k).getFirstChild().getNodeValue()); //獲取了element類型節點的節點值
                            }
                        }
                        System.out.println("======================結束遍歷第" + (i + 1) + "個產品的內容=================");
                    }
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }        
            }
    }

    運行結果如下:
    這里寫圖片描述

    一共有2個產品
    =================下面開始遍歷第1個產品的內容=================
     1個產品共有0個屬性
    第1個產品共有31個子節點
    第2個節點的節點名:產品唯一ID--節點值是:aab產品唯一ID
    第4個節點的節點名:通用名--節點值是:aa通用名
    第6個節點的節點名:商品名--節點值是:aa商品名
    第8個節點的節點名:劑型--節點值是:aa劑型
    第10個節點的節點名:批準文號--節點值是:aa批準文號
    第12個節點的節點名:規格--節點值是:aa規格
    第14個節點的節點名:包裝說明--節點值是:aa包裝說明
    第16個節點的節點名:包裝單位--節點值是:aa包裝單位
    第18個節點的節點名:生產企業--節點值是:aa生產企業
    第20個節點的節點名:大包裝轉換比--節點值是:aa大包裝轉換比
    第22個節點的節點名:中包裝轉換比--節點值是:aa中包裝轉換比
    第24個節點的節點名:備注--節點值是:aa備注
    第26個節點的節點名:庫存--節點值是:aa庫存
    第28個節點的節點名:供應價--節點值是:aa供應價
    第30個節點的節點名:是否上架--節點值是:aa是否上架
    ======================結束遍歷第1個產品的內容=================
    =================下面開始遍歷第2個產品的內容=================
     2個產品共有0個屬性
    第2個產品共有31個子節點
    第2個節點的節點名:產品唯一ID--節點值是:a121
    第4個節點的節點名:通用名--節點值是:b12
    第6個節點的節點名:商品名--節點值是:c231
    第8個節點的節點名:劑型--節點值是:dewrwer
    第10個節點的節點名:批準文號--節點值是:e324324
    第12個節點的節點名:規格--節點值是:f45645
    第14個節點的節點名:包裝說明--節點值是:g4543
    第16個節點的節點名:包裝單位--節點值是:hq324e2
    第18個節點的節點名:生產企業--節點值是:i76
    第20個節點的節點名:大包裝轉換比--節點值是:j453
    第22個節點的節點名:中包裝轉換比--節點值是:k4r43r
    第24個節點的節點名:備注--節點值是:le4tr4
    第26個節點的節點名:庫存--節點值是:mq3e2
    第28個節點的節點名:供應價--節點值是:nefrw
    第30個節點的節點名:是否上架--節點值是:o56
    ======================結束遍歷第2個產品的內容=================
    版權聲明:本文為qq_41182503原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_41182503/article/details/79974659

    智能推薦

    Java中的xml文件dom方式解析

    步驟如下: 圖片來源于網絡 實例代碼: 需要解析的文件為:...

    DOM4J方式解析XML文件

    DOM4J是一個Java的XML API,是JDOM的升級品,用來讀寫XML文件的。 DOM4J解析XML的步驟 創建SAXReader對象 調用read()方法 獲取根元素 通過迭代器遍歷直接節點 XML文件 解析過程 運行結果...

    DOM解析XML文件

    目錄結構 xml文件數據 DOM解析XML代碼 結果展示  ...

    android DOM解析XML

    XML文檔的概述 : 可擴展標記語言(eXtensibleMarkupLanguage,簡稱:XML: 前身是SGML(TheStandardGeneralizedMarkupLanguage),GML的重要概念:文件中能夠明確的將標示與內容分開/所有 文件的標示使用方法均一致 用途: XML設計用來傳送及攜帶數據信息,不用來表現或展示數據,HTML語言則用來表現數據,所以XML用途的焦點 是它說...

    XML解析-DOM

    關于XML解析 以前有說過 不過那是SAX方式的 今天說一下DOM方法     [序言] 1. 今天解析的目標是:香港天氣rss 地址為:   現在的目標就是:定制化該目標的解析辦法 我們還是查看一下該地址的源文件 具體方法:     現在貼其源文件://注:為了閱讀方便 我加了一些“回車換行”源文件是沒有這些的  ...

    猜你喜歡

    Dom解析xml文件

    DOM(文件對象模型)解析:解析器讀入整個文檔,然后構建一個駐留內存的樹結構,然后代碼就可以根據DOM接口來操作這個樹結構了。   優點:整個文檔讀入內存,方便操作:支持修改、刪除和重現排列等多種功能。   缺點:將整個文檔讀入內存中,保留了過多的不需要的節點,浪費內存和空間。 使用場合:一旦讀入文檔,還需要多次對文檔進行操作,并且在硬件資源充足的情況下(內存,CPU)。 DOM是基于樹形結構的節...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

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