1. 程式人生 > >Java解析xml檔案的方法

Java解析xml檔案的方法

什麼是 XML?

  • XML指可擴充套件標記語言(EXtensible Markup Language)
  • XML 是一種標記語言,很類似 HTML
  • XML 的設計宗旨是傳輸資料,而非顯示資料
  • XML 標籤沒有被預定義。您需要自行定義標籤。
  • XML 被設計為具有自我描述性。
  • XML 是 W3C 的推薦標準
  • XML 與 HTML 的主要差異
  • XML 不是 HTML 的替代。

XML 和 HTML 為不同的目的而設計:

  • XML 被設計為傳輸和儲存資料,其焦點是資料的內容。
  • HTML 被設計用來顯示資料,其焦點是資料的外觀。
  • HTML 旨在顯示資訊,而 XML 旨在傳輸資訊。

XML是一種通用的資料交換格式,它與平臺、語言、系統無關,給資料整合與互動帶來了極大的方便。對XML本身的語法與技術細節,可以參閱

w3c官方網站上相關的技術文獻,包括:DOM(Document Object Model)、DTD(Document Type Definition)、SAX(Simple API for XML)、XSD(Xml Schema Definition)、XSLT(Extensible Stylesheet Language Transformation)。

XML 文件形成一種樹結構

XML文件必須包含根元素。該元素是所有其他元素的父元素。

XML文件中的元素形成了一棵文件樹。這棵樹從根部開始,並擴充套件到樹的最底端。

所有元素均可擁有子元素:

<root>
    <child
>
<subchild>.....</subchild> </child> </root>

父、子以及同胞等術語用於描述元素之間的關係。父元素擁有子元素。相同層級上的子元素成為同胞(兄弟或姐妹)。

所有元素均可擁有文字內容和屬性(類似 HTML 中)。
例項

domtree

上圖表示下面的 XML 中的一本書:

<bookstore>
    <book category="COOKING">
        <title lang="en">Everyday Italian</title
>
<author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>

例子中的根元素是<bookstore> 。文件中的所有 <book> 元素都被包含在 <bookstore> 中。

<book>元素有 4 個子元素:<title><author><year><price>

XML在不同語言裡解析方式都是一樣的,只不過實現的語法不同。基本的解析方式有兩種,一種是DOM,另一種是SAX。DOM是基於XML文件樹結構的解析,SAX是基於事件流的解析。
本文介紹Java解析xml文件的幾種方法。

DOM解析xml文件

為xml文件的已解析版本定義了一組介面。解析器讀入整個文件,然後構建一個駐留記憶體的DOM樹結構,然後可以使用DOM介面來操作這個樹結構。
優點:整個文件樹在記憶體中,便於操作;支援刪除、修改、重新排列等多種功能。
缺點:將整個文件調入記憶體(包括無用的節點),如果文件過大,則佔用過多空間且浪費時間。
適用場合:一旦解析了文件還需多次訪問這些資料,硬體資源充足(記憶體、CPU)。

解析程式碼如下:

public class DomTest {
    public void parseXmlPath(String xmlPath) throws Exception{
        parseXmlFile(new File(xmlPath));
    }
    private void parseXmlFile(File file) throws Exception{
        //獲取DocumentBuilder工廠
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //從DocumentBuilder工廠中獲取DocumentBuilder物件
        DocumentBuilder db = dbf.newDocumentBuilder();
        //從DocumentBuilder物件中獲取Document物件
        Document doc = db.parse(file);
        //從Document物件中獲取根元素物件
        //Element 介面表示 HTML 或 XML 文件中的一個元素。
        //元素可能有與它們相關的屬性;由於 Element 介面繼承自 Node,
        //所以可以使用一般 Node 介面屬性 attributes 來獲得元素所有屬性的集合。
        //Element 介面上有通過名稱獲得 Attr 物件或通過名稱獲得屬性值的方法。
        //在 XML 中(其中的屬性值可能包含實體引用),應該獲得 Attr 物件來檢查表示屬性值的可能相當複雜的子樹。
        Element root = doc.getDocumentElement();
        parseElement(root);
    }
    private void parseElement(Element element){
        String tagName = element.getNodeName();
        //獲取當前元素的子節點
        NodeList childern = element.getChildNodes();
        System.out.println("<" + tagName +">");
        //實現 NamedNodeMap 介面的物件用於表示可以通過名稱訪問的節點的集合。
        NamedNodeMap map = element.getAttributes();
        if(map != null){
            for(int i = 0;i<map.getLength();i++){
                Attr attr = (Attr) map.item(i);
                String attrName = attr.getName();
                String attrValue = attr.getValue();
                System.out.println("  " + attrName +"=\""+attrValue+"\"");
            }
        }
        for(int i=0;i<childern.getLength();i++){
            Node node = childern.item(i);
            short nodeType = node.getNodeType();
            if(nodeType == Node.ELEMENT_NODE){
                parseElement((Element)node);
           }else if(nodeType == Node.TEXT_NODE){
                System.out.println(node.getNodeName()+":"+node.getNodeValue());
            }else if(nodeType == Node.COMMENT_NODE){
                System.out.print("<!--");
                Comment comment = (Comment)node;
                String data = comment.getText();
                System.out.print(data);
                System.out.print("-->");
            }
        }
        System.out.println("</"+tagName + ">");
    }
}

SAX解析XML文件

為解決DOM的問題,出現了SAX。SAX,事件驅動。當解析器發現元素開始、元素結束、文字、文件的開始或結束等時,傳送事件,編寫響應這些事件的程式碼,儲存資料。
優點:不用事先調入整個文件,佔用資源少;SAX解析器程式碼比DOM解析器程式碼小。
缺點:不是持久的;事件過後,若沒有儲存資料,那麼資料丟失;無狀態;從事件中只能得到文字,但不知道給文字屬於哪個元素。
適用場合:Applet;只需要XML文件的少量內容,很少回頭訪問;機器記憶體小。

程式碼如下:

DOM4J解析xml文件

DOM4J是一個非常優秀的Java Xml API,具有效能優異、功能強大和易於使用的特點,同時它也是一個開放原始碼的軟體。現在很多Java專案中都使用DOM4J讀寫xml檔案,很多Spring專案也是。