六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 36|回复: 0

Dom4j笔记总结《入门总结》

[复制链接]

升级  38%

3

主题

3

主题

3

主题

童生

Rank: 1

积分
19
 楼主| 发表于 2013-1-23 02:49:05 | 显示全部楼层 |阅读模式
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;    }} 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表