天天看點

XML解析——Dom4j

1、Dom4j(Document Object Model for Java)

  1. 清單内容

    Dom4j是一個Java的XML API,是jdom的更新品,用來讀寫XML檔案的,具有性能優異、功能強大和極其易使用的特點,它的性能超過sun公司官方的dom技術。

    Dom4j是一個易用的、開源的庫,用于XML,XPath和XSLT。它應用于Java平台,采用了Java集合架構并完全支援DOM,SAX和JAXP。DOM4J使用起來非常簡單。隻要你了解基本的XML-DOM模型,就能使用。

    【優點】

    ①大量使用了Java集合類,友善Java開發人員,同時提供一些提高性能的替代方法。

    ②支援XPath。

    ③有很好的性能。

    【缺點】

    ①大量使用了接口,API較為複雜。

2、解析XML過程是通過擷取Document對象,然後繼續擷取各個節點以及屬性等操作,是以擷取Document對象是第一步,大體說來,有三種方式:

①自己建立Document對象

Document doc=DocumentHelper.createDocument();

Element root=doc.addElement(“students”); //students是根節點

②讀取XML檔案擷取Document對象

SAXReader reader=new SAXReader();

Document doc=reader.read(new File(“XML檔案位址”));

③讀取XML文本擷取Document對象

String xml=”……“;

Document doc=reader.parseText(xml);

3、解析XML,取 2 中的一種方法先擷取Document對象:

SAXReader reader=new SAXReader();

Document doc=reader.read(new File(“XML檔案位址”));

Element root=doc.getRootElement();

一、開始周遊根節點下面的所有節點。listNodes(root);

public void listNodes(Element node){  
        System.out.println("目前節點的名稱:" + node.getName());  
        //首先擷取目前節點的所有屬性節點  
        List<Attribute> list = node.attributes();  
        //周遊屬性節點 ,輸出屬性
        for(Attribute attribute : list){  
            System.out.println("屬性"+attribute.getName() +":" + attribute.getValue());  
        }  
        //如果目前節點内容不為空,則輸出  
        if(!(node.getTextTrim().equals(""))){  
             System.out.println( node.getName() + ":" + node.getText());    
        }  
        //同時疊代目前節點下面的所有子節點,獲得Iterator對象
        //使用遞歸  
        Iterator<Element> iterator = node.elementIterator();  
        while(iterator.hasNext()){  
            Element e = iterator.next();  
            listNodes(e);  
        }  
    }  
           

二、Dom4j操作節點屬性

使用dom4j可以操作節點屬性,比如添加節點屬性、删除節點屬性、修改屬性值等操作。下面使用dom4j為上述的student1節點删除id屬性,新添name屬性。

public void test2()throws Exception{  
        //建立SAXReader對象  
        SAXReader reader = new SAXReader();  
        //讀取檔案 轉換成Document  
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
        //擷取根節點元素對象  
        Element root = document.getRootElement();  

        System.out.println("-------添加屬性前------");  
        //擷取節點  第一個  student節點
        Element student1Element = root.element("student");  
        //周遊  
        listNodes(student1Element);  
        //擷取其屬性  
         //root.element("student").elementText("id"); 也可以獲得id值
        Attribute idAttribute = student1Element.attribute("id");  
        //删除其屬性  
        student1Element.remove(idAttribute);  
        //為其添加新屬性  
        student1Element.addAttribute("name", "這是student1節點的新屬性");  
        System.out.println("-------添加屬性後------");  
        listNodes(student1Element);  
    }  
           

三、Dom4j新增節點,使用Dom4j可以删除指定節點、新增節點等操作。

public void test3()throws Exception{  
        //建立SAXReader對象  
        SAXReader reader = new SAXReader();  
        //讀取檔案 轉換成Document  
        Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));  
        //擷取根節點元素對象  
        Element root = document.getRootElement();  
        System.out.println("-------添加節點前------");  
        //擷取第一個 student   節點
        Element student1Element = root.element("student");  
        //添加phone節點 ,在student1Element父節點 下面增加
        Element phoneElement = student1Element.addElement("phone");  
        //為phone節點設定值  
        phoneElement.setText("137xxxxxxxx");  
        //把student1Element寫入新檔案,或是覆寫之前的檔案(現在的改變隻是記憶體上的)  
        writerDocumentToNewFile(document);  
           

同樣,删除節點先獲得父節點,在通過父節點删除

public static void remove(Document doc,String address) throws Exception{
        //得到想要删除的節點
        Element remove = doc.getRootElement().element("student");
        //删除節點時先得到父親節點,再删除
        remove.getParent().remove(remove);
        //寫入硬碟。
        writeToFile(doc,address);
    }
           

四、從記憶體寫入硬碟上。

public static void writerDocumentToNewFile(document) throws Exception {
        //良好的輸出格式
         OutputFormat format = OutputFormat.createPrettyPrint();
         //緊湊的輸出格式,内容擠在一行
         //format = OutputFormat.createCompactFormat();
         //寫出到address(XML檔案的位址),設定輸出檔案格式 和字元編碼"UTF-8"
        XMLWriter writer = new XMLWriter(
        new OutputStreamWriter(new FileOutputStream(new File(address)),"UTF-8"),format);
        writer.write(document);
        writer.close();
    }