Parsing XML


Using Iterators
Powerful Navigation with XPath
Fast Looping
Creating a new XML document
Writing a document to a file
Converting to and from Strings
Styling a Document with XSLT

Parsing XML

One of the first things you'll probably want to do is to parse an XML document of some kind. This is easy to do in
dom4j . The following code demonstrates how to this.

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

Using Iterators

A document can be navigated using a variety of methods that return standard Java Iterators. For example

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

Powerful Navigation with XPath

In dom4j XPath expressions can be evaluated on the Document or on any Node in the tree (such as Attribute, Element or ProcessingInstruction). This allows complex navigation throughout the document with a single line of code. For example.

    public void bar(Document document) {

        List list = document.selectNodes( "//foo/bar" );

        Node node = document.selectSingleNode( "//foo/bar/author" );

        String name = node.valueOf( "@name" );

    }

For example if you wish to find all the hypertext links in an XHTML document the following code would do the trick.

   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();

        }

    }

If you need any help learning the XPath language we highly recommend the Zvon tutorial which allows you to learn by example.

Fast Looping

If you ever have to walk a large XML document tree then for performance we recommend you use the fast looping method which avoids the cost of creating an Iterator object for each loop. For example

    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....

            }

        }

    }

Creating a new XML document

Often in dom4j you will need to create a new document from scratch. Here's an example of doing that.

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

Writing a document to a file

A quick and easy way to write a Document (or any Node) to a Writer is via the write() method.

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

  document.write( out );

If you want to be able to change the format of the output, such as pretty printing or a compact format, or you want to be able to work with Writer objects or OutputStream objects as the destination, then you can use the XMLWriter class.

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

    }

}

Converting to and from Strings

If you have a reference to a Document or any other Node such as an Attribute or Element, you can turn it into the default XML text via the asXML() method.

        Document document = ...;

        String text = document.asXML();

If you have some XML as a String you can parse it back into a Document again using the helper method DocumentHelper.parseText()

        String text = "<person> <name>James</name> </person>";

        Document document = DocumentHelper.parseText(text)

Styling a Document with XSLT

Applying XSLT on a Document is quite straightforward using the JAXP API from Sun. This allows you to work against any XSLT engine such as Xalan or SAXON. Here is an example of using JAXP to create a transformer and then applying it to a 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; } }

最新文章

  1. cache缓存
  2. Flatten 2D Vector
  3. iOS开发证书&quot;此证书的签发者无效&quot;解决方法
  4. weblogic远程调试
  5. js 正则表达式中的惰性匹配
  6. Linux 禁用笔记本触摸板
  7. ActionBarSherlock
  8. poj2196
  9. J2SE知识点摘记(十六)
  10. 连续多个git提交发生了冲突时
  11. 正则表达式与grep和sed
  12. Mysql 数据库复制
  13. Java中的XML
  14. struts2:OGNL表达式,遍历List、Map集合;投影的使用
  15. flask框架----基于flask的扩展实现的简单的页面登录
  16. 公网FTP(filezilla)改端口
  17. linux 系统安装配置 zabbix服务(源码安装)
  18. Junit4单元测试报错
  19. HDU 3416 Marriage Match IV(ISAP+最短路)题解
  20. sqlconnection dispose()与close()的区别

热门文章

  1. MVC架构模式概述
  2. Error: member names cannot be the same as their enclosing type
  3. Java基础 - 函数与方法
  4. Sql Server 2005 .bak备份文进行还原数据库
  5. jquery mobile 带参数跳转收集(紧个人使用,测试完会补全)
  6. Win8.1和office2013使用电话激活步骤
  7. Python函数之—— 装饰器(Day13)
  8. Nginx -HTTP和反向代理服务器简单配置
  9. linux eclipse的桌面快捷方式
  10. PHPExcel常用属性使用