已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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)和文档(Docuemnt)定义了一个公共的行为;|-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 onStart(ElementPath path) Element elt = path.getCurrent(); System.out.println(Found student: + elt.attributeValue(sn); / 添加对子元素的处理器。 path.addHandler(name, new NameHandler(); public void onEnd(ElementPath path) / 移除对子元素的处理器。 path.removeHandler(name); /* * 定义NameHandler处理器类,对的子元素进行处理。 */ private static class NameHandler im
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 动物基础及生理 3
- 堤防加固工程施工组织设计
- 屏蔽室工程施工工艺及施工方法
- 无负压供水设备安装调试施工方案及技术措施
- 烹饪初学者家常菜制作指导书
- 2025湖南郴州市保安服务有限公司招聘12人笔试历年参考题库附带答案详解
- 2025湖北宜昌市远安县栖凤城市发展建设集团有限公司招聘10人笔试历年参考题库附带答案详解
- 2025浙江宁波市余姚市公共交通有限公司招聘25人笔试历年参考题库附带答案详解
- 2025河南驻马店市正阳县县管国有企业招聘20人(第二批)笔试历年参考题库附带答案详解
- 2025河南周口市投资集团有限公司选(招)聘经营管理及工作人员12人笔试历年参考题库附带答案详解
- 2026入伍军检面试题目及答案
- 2026学年甘肃省陇南市三年级数学期末深度自测实战演练题(附答案)详细答案和解析
- 2026浙江省杭州市萧山区区长电话受理中心招聘重点基础提升(共500题)附带答案详解
- 《昆虫记》全阅读测试题及答案
- 2026年兰石化企业考核笔综合提升练习题及答案详解(考点梳理)
- 2026年人教版初一政治(道德与法治)下学期期末考试试卷及答案(共七套)
- 广告安装施工方案文本(3篇)
- 2024年7天连锁酒店员工手册
- 2026年湖北省黄冈市八年级地理生物会考真题试卷(+答案)
- 循环流化床锅炉(CFB炉)设计计算大纲
- 舞蹈类创新创业
评论
0/150
提交评论