已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DOM4J介绍与代码示例 2009-01-13 17:04:03标签:DOM4J 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/113473/126310 v:* behavior:url(#default#VML); o:* behavior:url(#default#VML); w:* behavior:url(#default#VML); .shape behavior:url(#default#VML); st1:*behavior:url(#ieooui) DOM4J是出品的一个开源XML解析包。Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。DOM4J下载jar包:/dom4j/dom4j-1.6.1.jarJAXEN(对XPath的支持):/jaxen/distributions/jaxen-1.1.1.zip1.DOM4J主要接口DOM4J主要接口都在org.dom4j这个包里定义。-Node为所有的dom4j中XML节点定义了多态行为;-Branch为能够包含子节点的节点如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为;|-Element 定义XML 元素;|-Document定义了XML文档;-DocumentType 定义XML DOCTYPE声明;-Entity定义 XML entity;-Attribute定义了XML的属性;-ProcessingInstruction 定义 XML 处理指令;-CharacterData是一个标识借口,标识基于字符的节点。如CDATA,Comment, Text;|- CDATA 定义了XML CDATA 区域;|-Text 定义XML 文本节点;|- Comment 定义了XML注释的行为;2.创建XML文档示例xml:students.xml sam 18 lin 20 下面是用dom4j创建上述文档,通过两种方式创建,一种是调用dom4j提供的方法,一种是通过字符串转换。XmlGen.javaimport java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;public class XmlGen public Document generateDocumentByMethod() Document document = DocumentHelper.createDocument(); / ProcessingInstruction Map inMap = new HashMap(); inMap.put(type, text/xsl); inMap.put(href, students.xsl); document.addProcessingInstruction(xml-stylesheet, inMap); / root element Element studentsElement = document.addElement(students); studentsElement.addComment(An Student Catalog); / son element Element stuElement = studentsElement.addElement(student); stuElement.addAttribute(sn, 01); Element nameElement = stuElement.addElement(name); nameElement.setText(sam); Element ageElement = stuElement.addElement(age); ageElement.setText(18); / son element Element anotherStuElement = studentsElement.addElement(student); anotherStuElement.addAttribute(sn, 02); Element anotherNameElement = anotherStuElement.addElement(name); anotherNameElement.setText(lin); Element anotherAgeElement = anotherStuElement.addElement(age); anotherAgeElement.setText(20); return document; public Document generateDocumentByString() String text = + + + sam18 + lin20; Document document = null; try document = DocumentHelper.parseText(text); catch (DocumentException e) e.printStackTrace(); return document; public void saveDocument(Document document, File outputXml) try / 美化格式 OutputFormat format = OutputFormat.createPrettyPrint(); /*/ 缩减格式 OutputFormat format = OutputFormat.createCompactFormat();*/ /*/ 指定XML编码 format.setEncoding(GBK);*/ XMLWriter output = new XMLWriter(new FileWriter(outputXml), format); output.write(document); output.close(); catch (IOException e) System.out.println(e.getMessage(); public static void main(String argv) XmlGen dom4j = new XmlGen(); Document document = null; / document=dom4j.generateDocumentByMethod(); document = dom4j.generateDocumentByString(); dom4j.saveDocument(document, new File(output.xml); 方法generateDocumentByMethod()通过调用方法构建xml文档:1.使用DocumentHelper得到Document实例Document document = DocumentHelper.createDocument();2.创建Processing Instructiondocument.addProcessingInstruction(xml-stylesheet, inMap);3.创建元素ElementElement studentsElement = document.addElement(students);4.为元素添加注释CommentstudentsElement.addComment(An Student Catalog);5.为元素添加属性studentsElement.addComment(An Student Catalog);6.为元素添加文本值TextageElement.setText(18);方法generateDocumentByString()通过字符串转换直接构建xml文档,使用DocumentHelper.parseText()来实现.document = DocumentHelper.parseText(text);方法saveDocument(Document document, File outputXml)将文档输出到文件保存,可指定字符编码,可指定格式化输出。3.修改XML文档这里使用xpath来定位待修改的元素和属性,需要jaxen的支持。示例中将students-gen.xml的第一个student元素的sn属性改为001,其子元素name内容改为jeff。XmlMod.javaimport java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class XmlMod public void modifyDocument(File inputXml) try SAXReader saxReader = new SAXReader(); Document document = saxReader.read(inputXml); List list = document.selectNodes(/students/student/sn); Iterator iter = list.iterator(); while (iter.hasNext() Attribute attribute = (Attribute) iter.next(); if (attribute.getValue().equals(01) attribute.setValue(001); list = document.selectNodes(/students/student); iter = list.iterator(); while (iter.hasNext() Element element = (Element) iter.next(); Iterator iterator = element.elementIterator(name); while (iterator.hasNext() Element nameElement = (Element) iterator.next(); if (nameElement.getText().equals(sam) nameElement.setText(jeff); XMLWriter output = new XMLWriter(new FileWriter(new File( students-modified.xml); output.write(document); output.close(); catch (DocumentException e) System.out.println(e.getMessage(); catch (IOException e) System.out.println(e.getMessage(); public static void main(String argv) XmlMod dom4jParser = new XmlMod(); dom4jParser.modifyDocument(new File(students-gen.xml); 1.使用File定位文件资源,并基于此获得Document实例SAXReader saxReader = new SAXReader();Document document = saxReader.read(inputXml);2.Document实例的selectNodes方法可以传入xpath,并返回一个List实例,基于此使用迭代器,完成特定的应用List list = document.selectNodes(/students/student/sn);4.遍历XML文档这里提供两种遍历方法,一种是基于迭代的遍历,一种是基于Visitor模式的遍历。XmlTra.javaimport java.io.File;import java.util.Iterator;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.ProcessingInstruction;import org.dom4j.VisitorSupport;import org.dom4j.io.SAXReader;public class XmlTra private File inputXml; public XmlTra(File inputXml) this.inputXml = inputXml; public Document getDocument() SAXReader saxReader = new SAXReader(); Document document = null; try document = saxReader.read(inputXml); catch (DocumentException e) e.printStackTrace(); return document; public Element getRootElement() return getDocument().getRootElement(); public void traversalDocumentByIterator() Element root = getRootElement(); / 枚举根节点下所有子节点 for (Iterator ie = root.elementIterator(); ie.hasNext();) System.out.println(=); Element element = (Element) ie.next(); System.out.println(element.getName(); / 枚举属性 for (Iterator ia = element.attributeIterator(); ia.hasNext();) Attribute attribute = (Attribute) ia.next(); System.out.println(attribute.getName() + : + attribute.getData(); / 枚举当前节点下所有子节点 for (Iterator ieson = element.elementIterator(); ieson.hasNext();) Element elementSon = (Element) ieson.next(); System.out.println(elementSon.getName() + : + elementSon.getText(); public void traversalDocumentByVisitor() getDocument().accept(new MyVisitor(); /* * 定义自己的访问者类 */ private static class MyVisitor extends VisitorSupport /* * 对于属性节点,打印属性的名字和值 */ public void visit(Attribute node) System.out.println(attribute : + node.getName() + = + node.getValue(); /* * 对于处理指令节点,打印处理指令目标和数据 */ public void visit(ProcessingInstruction node) System.out.println(PI : + node.getTarget() + + node.getText(); /* * 对于元素节点,判断是否只包含文本内容,如是,则打印标记的名字和 元素的内容。如果不是,则只打印标记的名字 */ public void visit(Element node) if (node.isTextOnly() System.out.println(element : + node.getName() + = + node.getText(); else System.out.println(- + node.getName() + -); public static void main(String argv) XmlTra dom4jParser = new XmlTra(new File(students-gen.xml); / dom4jParser.traversalDocumentByIterator(); dom4jParser.traversalDocumentByVisitor(); 方法traversalDocumentByIterator()提供一种基于迭代的遍历实现,每个Element通过elementIterator()和attributeIterator()取代其子元素和属性的迭代器。Visitor是GOF设计模式之一。其主要原理就是两种类互相保有对方的引用,并且一种作为Visitor去访问许多Visitable。DOM4J中的Visitor模式只需要自定一个类实现Visitor接口即可。 public class MyVisitor extends VisitorSupport public void visit(Element element) System.out.println(element.getName(); public void visit(Attribute attr) System.out.println(attr.getName(); 调用: root.accept(new MyVisitor() Visitor接口提供多种Visit()的重载,根据XML不同的对象,将采用不同的方式来访问。上面是给出的Element和Attribute的简单实现,一般比较常用的就是这两个。VisitorSupport是DOM4J提供的默认适配器,Visitor接口的Default Adapter模式,这个模式给出了各种visit(*)的空实现,以便简化代码。 注意,这个Visitor是自动遍历所有子节点的。如果是root.accept(MyVisitor),将遍历子节点。我第一次用的时候,认为是需要自己遍历,便在递归中调用Visitor,结果可想而知。5.使用ElementHandlerXmlHandler.javaimport java.io.File;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.ElementHandler;import org.dom4j.ElementPath;import org.dom4j.io.SAXReader;public class XmlHandler public static void main(String args) SAXReader saxReader = new SAXReader(); File file = new File(students.xml); try / 添加一个ElementHandler实例。 saxReader.addHandler(/students/student, new StudentHandler(); saxReader.read(file); catch (DocumentException e) System.out.println(e.getMessage(); /* * 定义StudentHandler处理器类,对元素进行处理。 */ private static class StudentHandler implements ElementHandler public void .Start(ElementPath path) Element elt = path.getCurrent(); System.out.println(Found student: + elt.attribut.ue(sn); / 添加对子元素的处理器。 path.addHandler(name, new NameHandler(); public void .End(ElementPath path) / 移除对子元素的处理器。 path.removeHandler(name); /* * 定义NameHandler处理器类,对的子元素进行处理。 */ private static class NameHandler implements ElementHa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络口碑传播机制-第1篇
- 交通运输安全监管规范指南
- 供应链金融服务操作规范(标准版)
- 城市排水系统运行维护规范
- 娱乐场所运营管理与安全规范手册(标准版)
- 合同管理与合规操作指南
- 交通信号控制系统维护与操作手册
- 医药行业研发与注册指南(标准版)
- 航空安全检查员操作规范手册(标准版)
- 医疗设备维修与维护服务指南
- 2026年六安市霍邱县三流乡公开招考村级后备干部5名笔试模拟试题及答案解析
- 2026届山东省济南市重点中学高三下学期3月综合模拟考试化学试题含解析
- idc数据中心运营制度
- 八年级地理下册《东北地区人口与城市的时空格局》教学设计与实施
- 英语-河南省2028届高一年级TOP二十名校十二月调研考试
- 高考化学2026年模拟试卷必刷题汇编-元素及其化合物(解答大题)
- 5.1《四大地理区域的划分》课件-2025-2026学年湘教版地理八年级下册
- 2025年10月自考00138中国近现代经济史试题及答案
- 苏教版小学三年级上数学口算题卡
- 俄国边境管理制度
- GB/T 25383-2025风能发电系统风力发电机组风轮叶片
评论
0/150
提交评论