Dom4j的入門

Parsing XML

    或許你想要做的第一件事情就是解析一個某種類型的XML文檔,用dom4j很容易做到。請看下面的示範代碼:

import java.net.URL;

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

public class Foo {

    public Document parse(URL url) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(url);
        return document;
    }
}
使用迭代器(Iterators)
    我們可以通過多種方法來操作XML文檔,這些方法返回java裏標準的迭代器(Iterators)。例如:

public void bar(Document document) throws DocumentException {
        Element root = document.getRootElement();
        //迭代根元素下面的所有子元素
        for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
            Element element = (Element) i.next();
            //處理代碼
        }

        //迭代根元素下面名稱爲"foo"的子元素
        for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
            Element foo = (Element) i.next();
            //處理代碼
        }

        // 迭代根元素的屬性attributes)元素
        for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
            Attribute attribute = (Attribute) i.next();
            // do something
        }
     }
強大的XPath導航
    在dom4j中XPath可以表示出在XML樹狀結構中的Document或者任意的節點(Node)(例如:Attribute,Element 或者ProcessingInstruction等)。它可以使在文檔中複雜的操作僅通過一行代碼就可以完成。例如:

public void bar(Document document) {
        List list = document.selectNodes( "//foo/bar" );
        Node node = document.selectSingleNode( "//foo/bar/author" );
        String name = node.valueOf( "@name" );
    }

    如果你想得到一個XHTML文檔中的所有超文本鏈接(hypertext links)你可以使用下面的代碼:

    public void findLinks(Document document) throws DocumentException {

        List list = document.selectNodes( "//a/@href" );

        for (Iterator iter = list.iterator(); iter.hasNext(); ) {
            Attribute attribute = (Attribute) iter.next();
            String url = attribute.getValue();
        }
    }
    如果你需要關於XPath語言的任何幫助,我們強烈推薦這個站點Zvon tutorial他會通過一個一個的例子引導你學習。
快速遍歷(Fast Looping)
如果你不得不遍歷一個非常大的XML文檔,然後纔去執行,我們建議你使用快速遍歷方法(fast looping method),它可以避免爲每一個循環的節點創建一個迭代器對象,如下所示:

public void treeWalk(Document document) {
        treeWalk( document.getRootElement() );
    }

    public void treeWalk(Element element) {
        for ( int i = 0, size = element.nodeCount(); i < size; i++ ) {
            Node node = element.node(i);
            if ( node instanceof Element ) {
                treeWalk( (Element) node );
            }
            else {
                // do something....
            }
        }
    }
生成一個新的XML文檔對象
    在dom4j中你可能常常希望用程序生成一個XML文檔對象,下面的程序爲你進行了示範:

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement( "root" );

        Element author1 = root.addElement( "author" )
            .addAttribute( "name", "James" )
            .addAttribute( "location", "UK" )
            .addText( "James Strachan" );
        
        Element author2 = root.addElement( "author" )
            .addAttribute( "name", "Bob" )
            .addAttribute( "location", "US" )
            .addText( "Bob McWhirter" );

        return document;
    }
}
將一個文檔對象寫入文件中
    將一個文檔對象寫入Writer對象的一個簡單快速的途徑是通過write()方法。

        FileWriter out = new FileWriter( "foo.xml" );
        document.write( out );

如果你想改變輸出文件的排版格式,比如你想要一個漂亮的格式或者是一個緊湊的格式,或者你想用Writer 對象或者OutputStream 對象來操作,那麼你可以使用XMLWriter 類。

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class Foo {

    public void write(Document document) throws IOException {

        // 寫入文件
        XMLWriter writer = new XMLWriter(
            new FileWriter( "output.xml" )
        );
        writer.write( document );
        writer.close();


        // 以一種優雅的格式寫入System.out對象
        OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter( System.out, format );
        writer.write( document );

        // 以一種緊湊的格式寫入System.out對象
        format = OutputFormat.createCompactFormat();
        writer = new XMLWriter( System.out, format );
        writer.write( document );
    }
}
轉化爲字符串,或者從字符串轉化
    如果你有一個文檔(Document)對象或者任何一個節點(Node)對象的引用(reference),象屬性(Attribute)或者元素(Element),你可以通過asXML()方法把它轉化爲一個默認的XML字符串:

        Document document = ...;
        String text = document.asXML();

如果你有一些XML內容的字符串表示,你可以通過DocumentHelper.parseText()方法將它重新轉化爲文檔(Document)對象:

        String text = "<person> <name>James</name> </person>";
        Document document = DocumentHelper.parseText(text);
通過XSLT樣式化文檔(Document)
    使用Sun公司提供的JAXP API將XSLT 應用到文檔(Document)上是很簡單的。它允許你使用任何的XSLT引擎(例如:Xalan或SAXON等)來開發。下面是一個使用JAXP創建一個轉化器(transformer),然後將它應用到文檔(Document)上的例子:

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;

public class Foo {

    public Document styleDocument(
        Document document, 
        String stylesheet
    ) throws Exception {

        // 使用 JAXP 加載轉化器
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer( 
            new StreamSource( stylesheet ) 
        );

        // 現在來樣式化一個文檔(Document)
        DocumentSource source = new DocumentSource( document );
        DocumentResult result = new DocumentResult();
        transformer.transform( source, result );

        // 返回經過樣式化的文檔(Document)
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }

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