jaxp与dom4j遍历xml树

本文深入探讨了使用Java处理XML的方法,包括JAXP和DOM4J。介绍了如何遍历XML树,包括使用JAXP的DocumentBuilder解析XML文件,并通过DocumentTraversal和NodeIterator遍历XML元素;同时,展示了使用DOM4J进行XML遍历的多种方法,如使用Iterators和VisitorPattern。此外,还讨论了DOM4J中快速遍历XML文档树的方法和使用VisitorPattern导航XML文档的技术。

1、jaxp遍历xml树

importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;

importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.traversal.DocumentTraversal;
importorg.w3c.dom.traversal.NodeFilter;
importorg.w3c.dom.traversal.NodeIterator;

publicclassMain{
publicstaticvoidmain(String[]argv)throwsException{
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
DocumentBuilderloader=factory.newDocumentBuilder();
Documentdocument=loader.parse("sample.xml");

DocumentTraversaltraversal=(DocumentTraversal)document;
NodeIteratoriterator=traversal.createNodeIterator(document.getDocumentElement(),
NodeFilter.SHOW_ELEMENT,null,true);

for(Noden=iterator.nextNode();n!=null;n=iterator.nextNode()){
System.out.println("Element:"+((Element)n).getTagName());
}
}
}

2、dom4j遍历xml树

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

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

Using Visitor Pattern

The visitor pattern has a recursive behavior and acts likeSAXin the way that partial traversal isnotpossible. This means complete document or complete branch will be visited. You should carefully consider situations when you want to use Visitor pattern, but then it offers a powerful and elegant way of navigation. This document doesn't explain Vistor Pattern in depth,GoF98covers more information.

import java.util.Iterator;

import org.dom4j.Visitor;
import org.dom4j.VisitorSupport;
import org.dom4j.Document;
import org.dom4j.Element;

public class VisitorSample {

  public void demo(Document doc) {

    Visitor visitor = new VisitorSupport() {
      public void visit(Element element) {
        System.out.println(
          "Entity name: " + element.getName()  + "text " + element.getText();
        );
      }
    };

    doc.accept( visitor );
  }
}

As you can see we used anonymous inner class to override theVisitorSupportcallback adapter method visit(Element element) and the accept() method starts the visitor mechanism.

Accessing XML content statically alone would not very special. Thus dom4j offers several methods for manipulation a documents content.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值