`

dom4j解析xml的访问者visitor模式

阅读更多
package org.dom4j;

import java.io.IOException;
import java.io.Writer;
import java.util.List;

public interface Node extends Cloneable {
                       .
                       .
                       .
 /**
     * <p>
     * <code>accept</code> is the method used in the Visitor Pattern.
     * </p>
     * 
     * @param visitor
     *            is the visitor in the Visitor Pattern
     */
    void accept(Visitor visitor);
                     .
                     .
                     .
}


<!------------------------------------------------------------------------------------->

/*

 * Copyright 2001-2004 (C) MetaStuff, Ltd. All Rights Reserved.

 * 

 * This software is open source. 

 * See the bottom of this file for the licence.

 * 

 * $Id: Visitor.java,v 1.6 2004/10/16 19:08:08 maartenc Exp $

 */



package org.dom4j;



/** <p><code>Visitor</code> is used to implement the <code>Visitor</code> 

  * pattern in DOM4J.

  * An object of this interface can be passed to a <code>Node</code> which will 

  * then call its typesafe methods.

  * Please refer to the <i>Gang of Four</i> book of Design Patterns

  * for more details on the <code>Visitor</code> pattern.</p>

  *

  * <p> This 

  * <a href="http://www.patterndepot.com/put/8/JavaPatterns.htm">site</a>

  * has further discussion on design patterns and links to the GOF book.

  * This <a href="http://www.patterndepot.com/put/8/visitor.pdf">link</a>

  * describes the Visitor pattern in detail.

  * </p>

  *

  * @author <a href="mailto:james.strachan@metastuff.com">James Strachan</a>

  * @version $Revision: 1.6 $

  */

public interface Visitor {



    /** <p>Visits the given <code>Document</code></p>

      *

      * @param document is the <code>Document</code> node to visit.

      */

    public void visit(Document document);



    /** <p>Visits the given <code>DocumentType</code></p>

      *

      * @param documentType is the <code>DocumentType</code> node to visit.

      */

    public void visit(DocumentType documentType);



    /** <p>Visits the given <code>Element</code></p>

      *

      * @param node is the <code>Element</code> node to visit.

      */

    public void visit(Element node);



    /** <p>Visits the given <code>Attribute</code></p>

      *

      * @param node is the <code>Attribute</code> node to visit.

      */

    public void visit(Attribute node);



    /** <p>Visits the given <code>CDATA</code></p>

      *

      * @param node is the <code>CDATA</code> node to visit.

      */

    public void visit(CDATA node);



    /** <p>Visits the given <code>Comment</code></p>

      *

      * @param node is the <code>Comment</code> node to visit.

      */

    public void visit(Comment node);



    /** <p>Visits the given <code>Entity</code></p>

      *

      * @param node is the <code>Entity</code> node to visit.

      */

    public void visit(Entity node);



    /** <p>Visits the given <code>Namespace</code></p>

      *

      * @param namespace is the <code>Namespace</code> node to visit.

      */

    public void visit(Namespace namespace);



    /** <p>Visits the given <code>ProcessingInstruction</code>

     * </p>

     *

     * @param node is the <code>ProcessingInstruction</code> node to visit.

     */

    public void visit(ProcessingInstruction node);



    /** <p>Visits the given <code>Text</code>

     * </p>

     *

     * @param node is the <code>Text</code> node to visit.

     */

    public void visit(Text node);



}

<!------------------------------------------------------------------------------------>
/*
* Copyright 2001-2005 (C) MetaStuff, Ltd. All Rights Reserved.
*
* This software is open source.
* See the bottom of this file for the licence.
*/

package org.dom4j.tree;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.dom4j.Comment;
import org.dom4j.Document;
import org.dom4j.DocumentType;
import org.dom4j.Element;
import org.dom4j.IllegalAddException;
import org.dom4j.Node;
import org.dom4j.ProcessingInstruction;
import org.dom4j.QName;
import org.dom4j.Text;
import org.dom4j.Visitor;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

/**
* <p>
* <code>AbstractDocument</code> is an abstract base class for tree
* implementors to use for implementation inheritence.
* </p>
*
* @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
* @version $Revision: 1.33 $
*/
public abstract class AbstractDocument extends AbstractBranch implements
Document {

/** The encoding of this document as stated in the XML declaration */
protected String encoding;

public AbstractDocument() {
}

public short getNodeType() {
return DOCUMENT_NODE;
}

public String getPath(Element context) {
return "/";
}

public String getUniquePath(Element context) {
return "/";
}

public Document getDocument() {
return this;
}

public String getXMLEncoding() {
return null;
}

public String getStringValue() {
Element root = getRootElement();

return (root != null) ? root.getStringValue() : "";
}

public String asXML() {
OutputFormat format = new OutputFormat();
format.setEncoding(encoding);

try {
StringWriter out = new StringWriter();
XMLWriter writer = new XMLWriter(out, format);
writer.write(this);
writer.flush();

return out.toString();
} catch (IOException e) {
throw new RuntimeException("IOException while generating textual "
+ "representation: " + e.getMessage());
}
}

public void write(Writer out) throws IOException {
OutputFormat format = new OutputFormat();
format.setEncoding(encoding);

XMLWriter writer = new XMLWriter(out, format);
writer.write(this);
}

/**
* <p>
* <code>accept</code> method is the <code>Visitor Pattern</code>
* method.
* </p>
*
* @param visitor
* <code>Visitor</code> is the visitor.
*/
public void accept(Visitor visitor) {
visitor.visit(this);

DocumentType docType = getDocType();

if (docType != null) {
visitor.visit(docType);
}

// visit content
List content = content();

if (content != null) {
for (Iterator iter = content.iterator(); iter.hasNext();) {
Object object = iter.next();

if (object instanceof String) {
Text text = getDocumentFactory()
.createText((String) object);
visitor.visit(text);
} else {
Node node = (Node) object;
node.accept(visitor);
}
}
}
}

public String toString() {
return super.toString() + " [Document: name " + getName() + "]";
}

public void normalize() {
Element element = getRootElement();

if (element != null) {
element.normalize();
}
}

public Document addComment(String comment) {
Comment node = getDocumentFactory().createComment(comment);
add(node);

return this;
}

public Document addProcessingInstruction(String target, String data) {
ProcessingInstruction node = getDocumentFactory()
.createProcessingInstruction(target, data);
add(node);

return this;
}

public Document addProcessingInstruction(String target, Map data) {
ProcessingInstruction node = getDocumentFactory()
.createProcessingInstruction(target, data);
add(node);

return this;
}

public Element addElement(String name) {
Element element = getDocumentFactory().createElement(name);
add(element);

return element;
}

public Element addElement(String qualifiedName, String namespaceURI) {
Element element = getDocumentFactory().createElement(qualifiedName,
namespaceURI);
add(element);

return element;
}

public Element addElement(QName qName) {
Element element = getDocumentFactory().createElement(qName);
add(element);

return element;
}

public void setRootElement(Element rootElement) {
clearContent();

if (rootElement != null) {
super.add(rootElement);
rootElementAdded(rootElement);
}
}

public void add(Element element) {
checkAddElementAllowed(element);
super.add(element);
rootElementAdded(element);
}

public boolean remove(Element element) {
boolean answer = super.remove(element);
Element root = getRootElement();

if ((root != null) && answer) {
setRootElement(null);
}

element.setDocument(null);

return answer;
}

public Node asXPathResult(Element parent) {
return this;
}

protected void childAdded(Node node) {
if (node != null) {
node.setDocument(this);
}
}

protected void childRemoved(Node node) {
if (node != null) {
node.setDocument(null);
}
}

protected void checkAddElementAllowed(Element element) {
Element root = getRootElement();

if (root != null) {
throw new IllegalAddException(this, element,
"Cannot add another element to this "
+ "Document as it already has a root "
+ "element of: " + root.getQualifiedName());
}
}

/**
* Called to set the root element variable
*
* @param rootElement
* DOCUMENT ME!
*/
protected abstract void rootElementAdded(Element rootElement);

public void setXMLEncoding(String enc) {
this.encoding = enc;
}
}
分享到:
评论

相关推荐

    dom4j解析xml详解

    16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行深度遍历,并在每个节点上执行特定的操作。 17. **XPath**: 提供了XPath表达式的查询能力,使得在复杂的数据结构中定位和提取数据变得更加容易。 #### 三、...

    java_Dom4j解析XML详解.doc

    16. **Visitor**:用于实现访问者模式。 17. **XPath**:提供XPath表达式的创建和解析功能。 #### 三、接口之间的继承关系 接口之间的继承关系如下所示: - `Cloneable` (标准Java接口) - `Node` - `Attribute` ...

    dom4j文档.xml

    16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行自定义遍历和操作。 17. **XPath**: 提供XPath表达式的接口,用于高效地查找XML文档中的特定节点。 在XML文档操作方面,DOM4J提供了以下功能: 1. **读取XML...

    dom4j详细使用用法

    - **`org.dom4j.Visitor`**:用于实现访问者模式,可以用来遍历XML树并执行某些操作。 - **`org.dom4j.XPath`**:提供了一个简单的接口来执行XPath查询,使得开发者能够轻松地根据XPath表达式检索文档中的节点。 ##...

    dom4j例子与简介

    此外,DOM4j还支持使用XPath表达式进行精确选择和遍历,以及利用`Visitor`模式对XML树进行深度优先或广度优先的遍历。 #### 结论 DOM4j通过其丰富且直观的API,极大地简化了Java中XML的处理工作。无论是读取、解析...

    DOM4J_xpath

    16. **Visitor**: 用于实现访问者模式。 17. **XPath**: 在分析一个字符串后会提供一个XPath表达式。 这些接口之间的继承关系如图所示: ```plaintext interface java.lang.Cloneable interface org.dom4j.Node |...

    DOM4j教程 例子

    - **Visitor**:用于实现访问者模式,可以遍历DOM4j中的节点。 - **XPath**:提供了XPath表达式的解析和查询功能。 这些接口之间的继承关系清晰明了,大部分接口都是从`Node`接口继承而来的。了解这些接口之间的...

    dom4j教程.pdf

    - **定义**:`Visitor`用于实现访问者模式。 - **使用场景**:遍历XML文档结构并执行特定操作时使用。 ##### 17. `XPath` - **定义**:`XPath`在分析一个字符串后会提供一个XPath表达式。 - **使用场景**:通过...

    JAVA操作XMLDOM4j简单教程

    此外,DOM4j还支持事件监听和访问者模式,使你可以根据需要定制XML处理流程。 总之,DOM4j是Java开发人员处理XML的理想工具,其简洁的API和高性能使其在XML处理领域中备受推崇。通过理解这些核心概念和方法,你将...

    访问者模式在实际开发中的Demo

    文件“访问者模式dom4j.zip”中可能包含了使用DOM4J库实现访问者模式的示例代码,通过访问XML文档的节点,实现各种定制化的操作。而“访问者模式1.zip”则可能是另一个访问者模式的应用案例,可能展示了如何在其他...

    dom4j教程,详细文档

    - **`Visitor`**: 实现了访问者模式。 - **`XPath`**: 提供XPath表达式的创建与查询能力。 #### 三、XML 文档操作 ##### 1. 读取XML文档 DOM4J提供了多种方式来读取XML文档,主要包括通过`SAXReader`和`DOMReader...

    dom4j_API_示例.doc

    - **Visitor**: 实现了访问者模式,允许用户自定义节点访问逻辑,扩展了DOM4J的功能性。 #### 接口继承关系 DOM4J的接口体系遵循了一定的继承规则,例如`Attribute`和`CharacterData`继承自`Node`,而`Element`和`...

    dom4j使用简介

    16. **Visitor**:用于实现访问者模式,允许对节点树执行不同的操作。 17. **XPath**:提供XPath表达式的解析和查询功能,用于在XML文档中定位节点。 #### 三、DOM4J 的接口继承关系 理解DOM4J中的接口继承关系...

    Dom4j使用简介 帮助文档

    16. **`Visitor`**:用于实现访问者模式,这是一种设计模式,允许在不修改节点类的前提下定义新的操作。 17. **`XPath`**:提供了 XPath 表达式的解析和评估能力。XPath 是一种用于在 XML 文档中导航的语言。 ####...

    DOM4J使用详解

    - `Visitor`:实现了访问者模式,允许遍历DOM4J树结构。 - `XPath`:提供XPath表达式的解析和评估,用于定位XML文档中的节点。 2. XML文档操作: - **读取XML文档**:通常使用`SAXReader`或`DOMReader`。`...

Global site tag (gtag.js) - Google Analytics