dom4j 快速入门指南

dom4j 快速入门指南

原文链接:http://dom4j.sourceforge.net/dom4j-1.6.1/guide.html

解析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;
    }

    public Document parse(String filename) throws Exception{
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(filename)); 
        return document;
    }
}

使用迭代器

dom4j提供了很多能够返回标准java迭代器的方法,你可以使用它们操作document。例如:

public void bar(Document document) throws DocumentException {

        Element root = document.getRootElement();

        // iterate through child elements of root
        for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
            Element element = (Element) i.next();
            // do something
        }

        // iterate through child elements of root with element name "foo"
        for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
            Element foo = (Element) i.next();
            // do something
        }

        // iterate through attributes of root
        for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
            Attribute attribute = (Attribute) i.next();
            // do something
        }
    }

XPath实现强大的导航

在dom4j中,XPath表达式可以用于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文档中所有的超链接,那么可以使用下面的代码。

  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 教程,你能够通过示例学习。

快速遍历

如果你要遍历一个很大的XML文档树,考虑的性能问题,我们推荐使用快速遍历方法,而不是创建一个迭代器。例如:

    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从头开始创建一个新的document。下面给出例子:

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;
    }
}

把document写入文件中

一个简单而且快速的方法是通过 write() 方法把Document(或者任何Node)写入文件中。

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 {

        // lets write to a file
        XMLWriter writer = new XMLWriter(
            new FileWriter( "output.xml" )
        );
        writer.write( document );
        writer.close();


        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter( System.out, format );
        writer.write( document );

        // Compact format to System.out
        format = OutputFormat.createCompactFormat();
        writer = new XMLWriter( System.out, format );
        writer.write( document );
    }
}

设置输出编码格式

OutputFormat format = OutputFormat.createPrettyPrint();

format.setEncoding("GBK");    // 指定XML编码

XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);

writer.write(document);

writer.close();

XML与字符串相互转换

如果你有一个Document的引用,或者任何其他的节点,比如Attribute或Element,那么你能通过 asXML() 方法转换为默认的XML文本。

SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
String text = document.asXML();
Element root = document.getRootElement();
String rootText = root.asXML();

如果你有一些XML的字符串,那么可以通过 DocumentHelper.parseText()方法解析它为Document。

String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);

使用XSLT设计一个Document

使用Sun提供的 JAXP 接口,可以很容易的应用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 {

        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer( 
            new StreamSource( stylesheet ) 
        );

        // now lets style the given document
        DocumentSource source = new DocumentSource( document );
        DocumentResult result = new DocumentResult();
        transformer.transform( source, result );

        // return the transformed document
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值