- 浏览: 199761 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hao3721:
dsfasd
ehcache 使用 -
nihaokid:
方法是不会存在在对象内存中的,它存在于方法区,建议看看jvm的 ...
Java 深层理解 父类引用指向子类对象 -
vissalan:
有一点没看明白Father f1 = (Father)s;这时 ...
Java 深层理解 父类引用指向子类对象 -
咖啡舞者:
非常感谢这种分享精神.
在BREW中实现自己的GUI(8)-IWEB的封装 -
咖啡舞者:
这是创建的代码。
在设备上调的。
界面在手机和模拟器上显示的差异
http://www.blogjava.net/bulktree/archive/2008/08/10/221122.html
[IT科技]dom4j操作xml基础--Visitor访问模式解析XML
旧一篇: Thinking XML: Firefox 3.0 和 XML 新一篇: JSON辅助类,可以把一些对象和集合转化为标准的JSON格式
http://www.blogjava.net/bulktree/archive/2008/08/10/221122.htmldom4j遍历xml文档树有种很特别的方式就是访问者(Visitor)模式,初次接触Visitor模式,写出个人理解大家交流!
Visitor访问者模式定义:作用于某个对象树中各个对象的操作. 它可以使你在不改变这些对象树本身的情况下,定义作用于这些对象树各个节点的新操作。
先看以下代码:Person为简单的vo类
- package org.bulktree.visitor;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Iterator;
- import java.util.List;
- /**
- *
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class ReadCollection {
- private Collection c = null;
- ReadCollection() {
- /*
- * 准备数据-String对象-Person对象-Integer对象-List对象
- */
- String str = "bulktree.laoshulin";
- Person person = new Person("bulktree", "22", "M");
- Integer a = new Integer(99);
- /*
- * 使用范型
- */
- List<String> list = new ArrayList<String>();
- list.add("BULKTREE");
- list.add("LAOSHULIN");
- list.add("OAKERTREE");
- c = new ArrayList();
- c.add(str);
- c.add(person);
- c.add(a);
- c.add(list);
- }
- /**
- * 遍历Collection中的每一个对象并打印
- */
- public void testCollection() {
- Iterator iter = getCollection().iterator();
- while (iter.hasNext()) {
- Object o = iter.next();
- if (o instanceof String) {
- System.out.println("String--> " + o.toString());
- } else if (o instanceof Person) {
- readPerson((Person) o);
- } else if (o instanceof Integer) {
- Integer inta = (Integer) o;
- System.out.println(inta.intValue());
- } else if (o instanceof List) {
- readList((List) o);
- }
- }
- }
- public Collection getCollection() {
- return c;
- }
- private void readPerson(Person person) {
- System.out.println("person-name-> " + person.getName());
- System.out.println("person-age-> " + person.getAge());
- System.out.println("person-sex-> " + person.getSex());
- }
- private void readList(List<String> list) {
- /*
- * 增强的for循环
- */
- for (String s : list) {
- System.out.println(s);
- }
- }
- public static void main(String[] args) {
- new ReadCollection().testCollection();
- }
- }
package org.bulktree.visitor; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; /** * * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class ReadCollection { private Collection c = null; ReadCollection() { /* * 准备数据-String对象-Person对象-Integer对象-List对象 */ String str = "bulktree.laoshulin"; Person person = new Person("bulktree", "22", "M"); Integer a = new Integer(99); /* * 使用范型 */ List<String> list = new ArrayList<String>(); list.add("BULKTREE"); list.add("LAOSHULIN"); list.add("OAKERTREE"); c = new ArrayList(); c.add(str); c.add(person); c.add(a); c.add(list); } /** * 遍历Collection中的每一个对象并打印 */ public void testCollection() { Iterator iter = getCollection().iterator(); while (iter.hasNext()) { Object o = iter.next(); if (o instanceof String) { System.out.println("String--> " + o.toString()); } else if (o instanceof Person) { readPerson((Person) o); } else if (o instanceof Integer) { Integer inta = (Integer) o; System.out.println(inta.intValue()); } else if (o instanceof List) { readList((List) o); } } } public Collection getCollection() { return c; } private void readPerson(Person person) { System.out.println("person-name-> " + person.getName()); System.out.println("person-age-> " + person.getAge()); System.out.println("person-sex-> " + person.getSex()); } private void readList(List<String> list) { /* * 增强的for循环 */ for (String s : list) { System.out.println(s); } } public static void main(String[] args) { new ReadCollection().testCollection(); } }
我们使用了 instanceof来判断 Object对象 o 的类型,这样做的缺点是代码中If/else if 很繁琐,而JDK中的范型又限制了只能使用相同的类型,这时Vistor访问模式派上用场了。
当我们要访问Collection的每一个Element(被访问者)时,定义一个accept操作使其具有可被访问性,我们定义一个Visiable接口,使Collection的每一个Element继承这个接口,实现自身的访问操作
package org.bulktree.visitor;
- /**
- * 可访问性--接收一个访问者
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public interface Visitable {
- public void accept(Visitor visitor);
- }
/** * 可访问性--接收一个访问者 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public interface Visitable { public void accept(Visitor visitor); }
下来是四个被访问的类型String,Integer,Person,Collection的实现类
- package org.bulktree.visitor;
- /**
- * 被访问者--String对象
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class StringElement implements Visitable {
- private String str;
- public StringElement(String str) {
- this.str = str;
- }
- public String getStr() {
- return str;
- }
- public void accept(Visitor visitor) {
- visitor.visitString(this);
- }
- }
package org.bulktree.visitor; /** * 被访问者--String对象 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class StringElement implements Visitable { private String str; public StringElement(String str) { this.str = str; } public String getStr() { return str; } public void accept(Visitor visitor) { visitor.visitString(this); } }
- package org.bulktree.visitor;
- /**
- * 被访问者--Integer对象
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class IntegerElement implements Visitable {
- private Integer i;
- public IntegerElement(Integer i) {
- this.i = i;
- }
- public Integer getI() {
- return i;
- }
- public void accept(Visitor visitor) {
- visitor.visitInteger(this);
- }
- }
package org.bulktree.visitor; /** * 被访问者--Integer对象 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class IntegerElement implements Visitable { private Integer i; public IntegerElement(Integer i) { this.i = i; } public Integer getI() { return i; } public void accept(Visitor visitor) { visitor.visitInteger(this); } }
- package org.bulktree.visitor;
- import java.util.Collection;
- /**
- * 被访问者--Person对象
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class PersonElement implements Visitable{
- private Person p;
- public PersonElement(Person p) {
- this.p = p;
- }
- public Person getP() {
- return p;
- }
- public void accept(Visitor visitor) {
- visitor.visitPerson(this);
- }
- }
package org.bulktree.visitor; import java.util.Collection; /** * 被访问者--Person对象 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class PersonElement implements Visitable{ private Person p; public PersonElement(Person p) { this.p = p; } public Person getP() { return p; } public void accept(Visitor visitor) { visitor.visitPerson(this); } }
- package org.bulktree.visitor;
- import java.util.Collection;
- import java.util.List;
- /**
- * 被访问者--Collection对象
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class CollectionElement implements Visitable {
- private Collection collection;
- public CollectionElement(Collection collection) {
- this.collection = collection;
- }
- public Collection getCollection() {
- return collection;
- }
- public void accept(Visitor visitor) {
- visitor.visitCollection(collection);
- }
- }
package org.bulktree.visitor; import java.util.Collection; import java.util.List; /** * 被访问者--Collection对象 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class CollectionElement implements Visitable { private Collection collection; public CollectionElement(Collection collection) { this.collection = collection; } public Collection getCollection() { return collection; } public void accept(Visitor visitor) { visitor.visitCollection(collection); } }
下来定义一个访问者Visitor接口,它可以访问Integer,String,Person(VO对象),Collection类型
- package org.bulktree.visitor;
- import java.util.Collection;
- /**
- * 访问者接口
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public interface Visitor {
- public void visitString(StringElement str);
- public void visitInteger(IntegerElement i);
- public void visitCollection(Collection collection);
- public void visitPerson(PersonElement perE);
- }
package org.bulktree.visitor; import java.util.Collection; /** * 访问者接口 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public interface Visitor { public void visitString(StringElement str); public void visitInteger(IntegerElement i); public void visitCollection(Collection collection); public void visitPerson(PersonElement perE); }
关键的Visitor实现类
- package org.bulktree.visitor;
- import java.util.Collection;
- import java.util.Iterator;
- /**
- * 访问者实现类
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class VisitorImpl implements Visitor {
- /*
- *访问字符串,仅对字符串输出
- */
- public void visitString(StringElement str) {
- System.out.println("*******************字符串输出*************************");
- System.out.println(str.getStr());
- }
- /**
- * 访问Integer类型
- */
- public void visitInteger(IntegerElement i) {
- System.out.println("*******************整型输出*************************");
- System.out.println(i.getI());
- }
- /**
- * 访问Collection对象,遍历每一个元素
- * 使用了一个if语句判断属于Visitable哪一个被访问对象,然后调用相应的accept方法
- * 实现递归调用
- */
- public void visitCollection(Collection collection) {
- Iterator iter = collection.iterator();
- while (iter.hasNext()) {
- Object o = iter.next();
- if (o instanceof Visitable) {
- ((Visitable) o).accept(this);
- }
- }
- }
- /**
- * 访问单个Person对象
- */
- public void visitPerson(PersonElement perE) {
- System.out.println("*******************Person对象输出*************************");
- Person person = perE.getP();
- System.out.println("person-name-> " + person.getName());
- System.out.println("person-age-> " + person.getAge());
- System.out.println("person-sex-> " + person.getSex());
- }
- }
package org.bulktree.visitor; import java.util.Collection; import java.util.Iterator; /** * 访问者实现类 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class VisitorImpl implements Visitor { /* *访问字符串,仅对字符串输出 */ public void visitString(StringElement str) { System.out.println("*******************字符串输出*************************"); System.out.println(str.getStr()); } /** * 访问Integer类型 */ public void visitInteger(IntegerElement i) { System.out.println("*******************整型输出*************************"); System.out.println(i.getI()); } /** * 访问Collection对象,遍历每一个元素 * 使用了一个if语句判断属于Visitable哪一个被访问对象,然后调用相应的accept方法 * 实现递归调用 */ public void visitCollection(Collection collection) { Iterator iter = collection.iterator(); while (iter.hasNext()) { Object o = iter.next(); if (o instanceof Visitable) { ((Visitable) o).accept(this); } } } /** * 访问单个Person对象 */ public void visitPerson(PersonElement perE) { System.out.println("*******************Person对象输出*************************"); Person person = perE.getP(); System.out.println("person-name-> " + person.getName()); System.out.println("person-age-> " + person.getAge()); System.out.println("person-sex-> " + person.getSex()); } }
客户端测试:
- package org.bulktree.visitor;
- import java.util.ArrayList;
- import java.util.Collection;
- /**
- * Visitor模式客户端
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class VisitorMain {
- public static void main(String[] args) {
- Visitor visitor = new VisitorImpl();
- /*
- * 访问字符串
- */
- System.out.println("======================访问字符串=========================");
- StringElement stringE = new StringElement(
- "bulktree.laoshulin.oakertree");
- visitor.visitString(stringE);
- /*
- * 访问集合
- */
- System.out.println("=======================访问集合========================");
- Collection list = new ArrayList();
- StringElement str1 = new StringElement("aaa");
- StringElement str2 = new StringElement("bbb");
- list.add(str1);
- list.add(str2);
- PersonElement perE1 = new PersonElement(new Person("LAOSHULIN", "22", "M"));
- PersonElement perE2 = new PersonElement(new Person("BULKTREE", "21", "W"));
- list.add(perE1);
- list.add(perE2);
- IntegerElement intE1 = new IntegerElement(new Integer(99));
- IntegerElement intE2 = new IntegerElement(new Integer(100));
- list.add(intE1);
- list.add(intE2);
- visitor.visitCollection(list);
- /*
- * 访问Person
- */
- System.out.println("======================访问Person=========================");
- Person p = new Person("BULKTREE", "22", "M");
- PersonElement perE = new PersonElement(p);
- visitor.visitPerson(perE);
- /*
- * 访问Integer
- */
- System.out.println("=====================访问Integer==========================");
- IntegerElement intE = new IntegerElement(new Integer(77));
- visitor.visitInteger(intE);
- }
- }
package org.bulktree.visitor; import java.util.ArrayList; import java.util.Collection; /** * Visitor模式客户端 * @author bulktree Email: laoshulin@gmail.com * @date Aug 10, 2008 */ public class VisitorMain { public static void main(String[] args) { Visitor visitor = new VisitorImpl(); /* * 访问字符串 */ System.out.println("======================访问字符串========================="); StringElement stringE = new StringElement( "bulktree.laoshulin.oakertree"); visitor.visitString(stringE); /* * 访问集合 */ System.out.println("=======================访问集合========================"); Collection list = new ArrayList(); StringElement str1 = new StringElement("aaa"); StringElement str2 = new StringElement("bbb"); list.add(str1); list.add(str2); PersonElement perE1 = new PersonElement(new Person("LAOSHULIN", "22", "M")); PersonElement perE2 = new PersonElement(new Person("BULKTREE", "21", "W")); list.add(perE1); list.add(perE2); IntegerElement intE1 = new IntegerElement(new Integer(99)); IntegerElement intE2 = new IntegerElement(new Integer(100)); list.add(intE1); list.add(intE2); visitor.visitCollection(list); /* * 访问Person */ System.out.println("======================访问Person========================="); Person p = new Person("BULKTREE", "22", "M"); PersonElement perE = new PersonElement(p); visitor.visitPerson(perE); /* * 访问Integer */ System.out.println("=====================访问Integer=========================="); IntegerElement intE = new IntegerElement(new Integer(77)); visitor.visitInteger(intE); } }
使用访问者模式的前提是对象群结构中(Collection) 中的对象类型很少改变,在两个接口Visitor(访问)和Visitable(可访问)中,确保Visitable很少变化,也就是说,确保不能有新的元素类型加进来,可以变化的是访问者行为或操作,也就是Visitor的不同子类可以有多种,这样使用访问者模式最方便,当系统中存在着固定的数据结构,且有着不同的行为,访问者模式也许是个不错的选择
- package org.bulktree.xml;
- import java.io.File;
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.Element;
- import org.dom4j.VisitorSupport;
- import org.dom4j.io.SAXReader;
- /**
- * dom4j访问者模式解析xml文档
- * @author bulktree Email: <A href="mailto:laoshulin@gmail.com">laoshulin@gmail.com</A>
- * @date Aug 10, 2008
- */
- public class ReadXmlVisitor {
- ReadXmlVisitor() {
- File file = new File("student.xml");
- SAXReader saxReader = new SAXReader();
- try {
- Document doc = saxReader.read(file);
- doc.accept(new MyVisitor());
- } catch (DocumentException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- new ReadXmlVisitor();
- }
- }
- /*
- * org.dom4j 包里有Visitor接口,VisitorSupport是它的实现类,定义了多个重载的visit方法
- */
- class MyVisitor extends VisitorSupport {
- public void visit(Attribute attr) {
- String name = attr.getName();
- String value = attr.getValue();
- System.out.println("Attribute--> " + name + " : " + value);
- }
- public void visit(Element element) {
- String name = element.getName();
- if (element.isTextOnly()) {
- System.out
- .println("Element--> " + name + " : " + element.getText());
- } else {
- System.out.println("Element-->" + name);
- }
- }
- }
发表评论
-
Java实现通用线程池
2009-10-12 16:17 1071URL: http://blog.csdn.net/polar ... -
java 内存溢出分析
2009-10-09 15:44 1232内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终 ... -
Java的内存泄漏
2009-10-09 13:27 840Java 的一个重要优点就 ... -
Dom4j的全面解析
2009-07-03 17:03 1016作者:冰云 icecloud(AT)sin ... -
关于java使用javacomm20-win32实践总结
2009-06-21 23:34 766由于这几天要通过java调 ... -
20非常有用的Java程序片段 (下)
2009-05-26 14:29 111217. 把 Array 转换成 Map vi ... -
20非常有用的Java程序片段 (中)
2009-05-26 14:08 92612. 单实例Singleton 示例 请先阅读这篇文章 ... -
20非常有用的Java程序片段 (上)
2009-05-26 14:02 974下面是20个非常有用的Java程序片段,希望能对你有用。 1 ... -
java实现 冒泡排序 插入排序 选择排序
2009-03-16 00:47 1105package test.sort; public clas ... -
红黑树的Java实现
2009-03-16 00:42 979红黑树可能是要考虑情况最多的BST树了,它有自己的规则(见代码 ... -
排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
2009-03-16 00:40 1189转自:http://www.blogjava.net/java ... -
排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
2009-03-16 00:37 910转自:http://www.blogjava.net/java ... -
Java 深层理解 父类引用指向子类对象
2009-03-10 11:44 2698从对象的内存角度来理解试试. 假设现在有一个父类Father, ... -
java native method
2009-03-02 20:40 984一. 什么是Native Method 简单地讲,一个Na ... -
java 简介--学习笔记
2009-02-22 22:26 764一 java 特点 1 、简单 Java 设计 ... -
String理解
2009-02-21 00:44 875要理解 java中String的运作方式,必须明确一点:Str ... -
Java的时间处理
2009-02-21 00:42 9081. Java计算时间依靠1970 ...
相关推荐
16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行深度遍历,并在每个节点上执行特定的操作。 17. **XPath**: 提供了XPath表达式的查询能力,使得在复杂的数据结构中定位和提取数据变得更加容易。 #### 三、...
在实际操作XML文档时,DOM4J提供了一些关键的类和方法。例如,要读取XML文档,可以使用`SAXReader`类。以下代码展示了如何加载XML文件并获取`Document`对象: ```java import org.dom4j.Document; import org.dom4j...
由于DOM4J的设计简洁易用,对于熟悉XML-DOM模型的开发者来说,上手非常快。 #### 二、DOM4J的核心接口 DOM4J的核心接口定义在`org.dom4j`包内,这些接口提供了对XML文档进行操作的能力。下面详细介绍这些接口及其...
16. **Visitor**: 实现了访问者模式,允许对DOM4J树进行自定义遍历和操作。 17. **XPath**: 提供XPath表达式的接口,用于高效地查找XML文档中的特定节点。 在XML文档操作方面,DOM4J提供了以下功能: 1. **读取XML...
DOM4J是一个强大的Java库,专门用于处理XML文档。...通过Visitor模式,我们可以灵活地对XML文档进行结构化操作,而无需更改原始的DOM4J类。学习和掌握这些知识点,将有助于提升在XML处理方面的技能。
DOM4J 是一个基于 Java 的 XML 解析包,用于解析和操作 XML 文档。它提供了一个简洁的 API,方便用户快速地解析和操作 XML 文档。DOM4J 采用了 Java 集合框架,完全支持 DOM、SAX 和 JAXP。 二、DOM4J 的主要接口 ...
DOM4J支持Visitor模式,这是一种常用的模式,允许对文档中的节点进行访问操作而不暴露文档的具体结构。通过实现`org.dom4j.Visitor`接口或使用`org.dom4j.visitor.AbstractVisitor`,可以自定义访问逻辑。 ```java ...
在 dom4j 中,可以实现 `Visitor` 接口,通过遍历 DOM4J 树,执行特定操作。 总的来说,dom4j 为 Java 开发者提供了一套完整的 XML 处理工具,使得处理 XML 文档变得简单而高效。无论是创建、解析、修改还是查询 ...
DOM4J的灵活性还体现在支持Visitor模式,通过实现`Visitor`接口,可以遍历XML树并执行特定操作。此外,XPath的使用使得定位XML节点变得极其方便,可以快速访问和修改XML文档的任意部分。 总之,DOM4J是Java开发者...
- **`org.dom4j.Visitor`**:用于实现访问者模式,可以用来遍历XML树并执行某些操作。 - **`org.dom4j.XPath`**:提供了一个简单的接口来执行XPath查询,使得开发者能够轻松地根据XPath表达式检索文档中的节点。 ##...
【dom4j基础入门文档(SAX,DOM,XPATH)】 dom4j是一个流行的Java库,专门用于处理XML文档。相较于W3C DOM API,dom4j的优势在于它内置了本地XPath支持,使得XML文档的查询和操作更为简便。本文将深入介绍dom4j的...
dom4j 实现了设计模式中的 Visitor 模式,允许遍历 DOM 树并执行自定义操作,而无需更改节点类。通过实现 `Visitor` 接口并调用 `accept(Visitor visitor)` 方法,可以对树进行深度遍历。 总结,dom4j 是一个功能...
### DOM4j从基础到精通知识点详解 #### 一、DOM4j介绍 DOM4j是一种用于处理XML的Java API,其设计目的是为了提供一种既高效又易于...以上是对DOM4j基础知识及高级特性的详细介绍,希望对您学习和使用DOM4j有所帮助。
- **Visitor**: 实现了访问者模式,允许用户自定义节点访问逻辑,扩展了DOM4J的功能性。 #### 接口继承关系 DOM4J的接口体系遵循了一定的继承规则,例如`Attribute`和`CharacterData`继承自`Node`,而`Element`和`...
DOM4J以其简洁易用而闻名,只要对基本的XML-DOM模型有所了解,即可快速上手。 DOM4J的最大特点是使用了大量的接口,并且这些接口均定义在`org.dom4j`包下。下面列举了一些关键接口及其功能: 1. **Attribute**: ...
在本教程中,我们将深入探讨DOM4j的核心概念、主要接口以及如何使用它来读取、解析和操作XML文档。 首先,DOM4j的主要接口集中在`org.dom4j`包中,这些接口定义了XML文档的各种组成部分。例如: 1. `Attribute`:...