XML文件在Java中運用dom解析的實例

什麼是XML文件?

XML文件叫做可擴展標籤化語言,據說是爲了取代HTML而產生的,從我們可以在XML中配合CSS樣式來完成基本界面框架可以看出來還是有那麼點意思。XML在語法和html語法差別不大,但是比HTML語法要嚴謹許多,可能沒HTML那麼靈活。當然啦,從HTML現在的廣泛程度來看,XML可能沒有完成取代HTML的任務,所以它常常用來做以下任務:

1.寫配置文件用

2.一個小型的“數據庫”

什麼是DOM解析?

DOM:文件對象編程
BOM: 瀏覽器對象編程

XML文件的解析方式?

1.DOM解析:
JAXP,JDOM工具,以及dom4j工具(流傳最廣)
2.SAX解析

怎麼解析?

我們可以發現XML文件是隻有一個根標籤但是卻可以擁有無數個子標籤的,就類似於樹的結構,所以我們可以將XML文檔解析成Document對象(在dom4j中有這個類),然後通過Document對象可以得到其下面的其他節點對象,通過節點對象訪問xml文檔的內容(標籤,屬性,內容,註釋)。

DOM解析原理:

xml解釋器一次性把整個xml文件加載進內存,然後在內存中構造一棵Document的對象樹,通過Document對象得到樹上的節點對象,通過節點對象訪問(或者操作)xml文檔的內容。

如何解析XML文件?

在eclipse中導入dom4j的jar包
(1)將xml文件解析成Document對象:

package cn.weilylab.dom4j_test;

import java.io.File;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class ReadXML {
    public static void main(String[] args) {
        //1.創建一個xml解析器
        SAXReader reader=new SAXReader();
        try {
            //讀取這個文件對象
            Document  doc =reader.read(new File("./src/test.xml"));
            System.out.println(doc);
        } catch (DocumentException e) {
            e.printStackTrace(); 
            throw new RuntimeException(e);
        }

    }

}

(2)如何獲得xml的每個標籤?

package cn.weilylab.dom4j_test;
/*
這個實例用了兩種方式來輸出xml中的節點,其中因爲只有標籤節點中才有子節點
    方法1:使用迭代器遍歷遍歷每個節點判斷是否是element然後輸出這個element的名字
    方法2:先得到根標籤,在遞歸中使用迭代器來遍歷節點但是選擇了使用了遞歸的方式來輸出每一層的節點
 */
import java.io.File;
import java.util.Iterator;



import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;

public class ReadXMLdetails{

    @Test
    public void test1() throws Exception{
        SAXReader reader=new SAXReader();
        Document doc =reader.read(new File("./src/test.xml"));

        Iterator<Node> it= doc.nodeIterator();
        while(it.hasNext()) {
            Node node=it.next();
            String name=node.getName();
            System.out.println(name);

            if(node instanceof Element) {
                Element elem=(Element)node;
                Iterator<Node> it2=elem.nodeIterator();
                while(it2.hasNext()) {
                    Node node2=it2.next();
                    System.out.println(node2.getName());
                }
            }
        }
    }


    /**
     * 遍歷文檔中所有子節點
     */
    @Test
    public void test2() throws Exception{
        SAXReader reader=new SAXReader();
        Document doc=reader.read(new File("./src/test.xml"));
        //得到根標籤
        Element rootElme=doc.getRootElement();
        getChildNodes(rootElme);
    }

    private void getChildNodes(Element elem) {
        System.out.println(elem.getName());

        //得到子節點
        Iterator<Node> it =elem.nodeIterator();
        while(it.hasNext()) {
            Node node =it.next();
            if(node instanceof Element) {
                Element el=(Element)node;
                //遞歸
                getChildNodes(el);
            }
        }
    }
}

當然在dom4j中有很多的接口。針對於節點,標籤,屬性,文本都有不同的方法,類似於上面的方法一樣,所以可以做到在Java中完全地將配置文件讀取出來,相當於一模一樣的讀取一份出來。鑑於這一塊在目前而言不是重點,所以在此不做深究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章