为什么80%的码农都做不了架构师?>>>   

dom4j使用的解析器对象都是由其他包提供的,虽然它可以使用不同的解析器(SAX,DOM,StAX等),但通常使用的是SAX

解析文档

dom4j不是一个XML解析器,它必须使用独立的解析器来创建Document对象。通常,你可以通过dom4j中的org.dom4j.io.SAXReader类来使用SAX解析器。调用SAXReader的read()方法将创建一个org.xml.sax.XMLReader类的实例,并且通过它实现的ContentHandler接口调用DocumentFactory创建dom4j对象树。解析java.io.File对象的代码如下:

//假设我们获得了一个路径作为命令行参数
File file = new File(args[0]);
SAXReader reader = new SAXReader();
Document doc = reader.read(file);

在创建SAXReader实例时,通过使用不同的构造器参数来确定(更确切地说,SAXReader是由下层的SAX解析器来确认),是使用预备的DocumentFactory实现,还是特定的SAX实现。此外,在SAXReader对象中还有各种setter方法(setValidating(),setDocumentFactory()等)来设置这些属性和其他的属性。可以参考dom4j的javadoc完整文档信息。read()方法是一个重载方法,它能接收下面输入参数中的一项:

  • A java.io.File object

  • A java.net.URL object

  • A system ID as a String object (which could be a URL or a filename)

  • A java.io.InputStream object

  • A java.io.Reader object

  • A java.io.InputStream object and  a system ID resolving relative URLs

  • A java.io.Reader object and a system ID for resolving relative URLs

  • An org.xml.sax.InputSource object

如果将一个String对象当作XML来解析,你可以把这个String对象封装在java.io.StringReader中,也可以把它传送给一个实用方法DocumentHelper.parseText()。parseText()方法将确定正确的编码,解析String对象,并返回一个Document对象。

使用dom4j解析XML文档示例:

package org.wangwa;import java.io.File;
import java.util.List;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/*解析XML文档简单示例*/
public class Dom4jParseXml {@SuppressWarnings("rawtypes")public static void main(String[] args) {File file = new File("/home/fuhd/apk/gw/a" + "/com.application.zomato.apk/AndroidManifest.xml");SAXReader reader = new SAXReader();try {Document doc = reader.read(file);Element root = doc.getRootElement();List listE = root.elements("uses-feature");if(listE != null){for(Object e : listE){System.out.println(((Element)e).asXML());}}} catch (DocumentException e) {e.printStackTrace();}}
}

创建Document对象

Document对象的创建可以由DocumentFactory类或者它的子类来完成。DocumentHelper类也提供一些静态方法,用来创建Document,Element,Attribute等对象。这些静态方法调用DocumentFactory实例中相对应的方法。为了简化,你可以这样写:

DocumentFactory factory = DocumentFactory.getInstance();
Document doc = factory.createDocument();

你也可以写成这样:

Document doc = DocumentHelper.createDocument();

因为没有直接使用DocumentFactory对象,因此只保留了一行代码,但是,我们失去了使用不同工厂类的这一优势,这将是我们稍后进行深入讨论的内容。

一旦创建了Document对象,使用add()方法增加节点是件非常容易的事。根据XML规范,可以根据自己的要求添加多个Comment和ProcessingInstruction对象到Document中,但只能有一个Element。除add()方法外,在Document的父接口Branch中还定义了一组名称为addElement()方法,这些方法可以接收QName对象,本地名称或者是本地名称和命名空间的URI。当你调用一个addElement()方法时,DocumentFactory的createElement()方法将会被调用,而且这个Element对象将会被设置成为Document对象的根元素。因此,这里的两块代码做的是相同的事情:

//块1:完整方法
Element myElement = factory.createElement("name");
doc.add(myElement);
//块2:简短方式
doc.addElement("name");

addElement()方法返回的是一个新创建的对象,它允许你像这样链式地调用方法:

doc.addElement("root").addElement("child").addElement("innerChild");

生成的文档应该是这样:

<root><child><innerChild /></child>
</root>

名称空间和限定名            在dom4j中,对于其他XML API,元素的名称和属性是用一个三元组来表示的:本地名,名称空间前缀和名称空间URI来表示的。名称空间前缀和名称空间URI都封装在org.dom4j.Namespace类中,而它自己又被封装在org.dom4j.QName中。Namespace和QName被实例化后,它们的属性就不可更改了,虽然它们都提供了公共的构造方法,但最好是通过类的静态方法get()方法来实例化这两个实例。get()方法利用了对象缓存,这样当使用相同参数重复调用get()方法时,就可以返回相同的对象,从而降低内存消耗,加快了对象比较的速率,增加了XML的一致性。

输出文档

在dom4j中输出文档既包含了对XML的序列化,还包含了将dom4j对象传递给其他的XML APIs(非dom4j的API)。dom4j采用了最为简单的机制将Document对象转换成String对象:

String output = doc.asXML();

就是这样,asXML()方法是Node接口的一部分,因此,它在dom4j对象模型中的每一个接口中都有效。asXML()方法不能进行格式化的输出,除Document对象之外,它使用的字符集编码总是UTF-8。如果你想要设置自己的输出格式,就需要使用org.dom4j.io.XMLWriter类。XMLWriter将输出格式以XML对象的形式写入到java.io.Writer对象,或者是java.io.InputStream对象。当你创建一个XMLWriter实例时,就可以使用org.dom4j.io.OutputFormat对象来控制XML对象的输出格式。dom4J包含了三种格式:

  • Default:由new OutputFormat()创建,Raw格式。没有缩进或增加换行符。XML声明的编码总是写在新的一行中。

  • Pretty Print:由OutputFormat.createPrettyPrint()创建,会在元素之间产生两个空格的缩进,并且产生换行符。文本会被裁剪,使之标准化。

  • Compact:由OutputFormat.createCompactFormat()创建,默认格式是对文本进行微调,增强文本格式的标准化。

你可以传入OutputFormat对象到XMLWriter构造器中。可是XMLWriter并没有setOutputFormat()或getOutputFormat()这些方法集,这样就不能再更改XMLWriter的格式了。你创建OutputFormat对象,并把它传递给XMLWriter构造器,然后再去调用OutputFormat实例中的mutator方法。但是不推荐这么做,因为这会导致行为不一致。在创建XMLWriter之前,要配置好OutputFormat对象,以免出错。实际上,OutputFourmat对象能定制出远超出这三种默认格式的输出格式。事实上,它可以作为这些定义的模板,这里我们就不做介绍了。

创建Document对象并输出的示例:

package org.wangwa;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;public class CreateDocument {public static void main(String[] args) {Document doc = DocumentHelper.createDocument();doc.addElement("class").addElement("student").addAttribute("name", "fuhd").addText("这是个好学生");//OutputFormat format = new OutputFormat();                                      //创建Raw格式,默认OutputFormat format = OutputFormat.createPrettyPrint();                   //创建Pretty Print格式//OutputFormat format = OutputFormat.createCompactFormat();        //创建Compact格式try {XMLWriter writer = new XMLWriter(format);writer.setOutputStream(new BufferedOutputStream(new FileOutputStream(new File("/home/fuhd/student"))) );writer.write(doc);} catch (UnsupportedEncodingException e1) {e1.printStackTrace();} catch (IOException e2) {e2.printStackTrace();} catch (Exception e3) {e3.printStackTrace();}}
}

转载于:https://my.oschina.net/fhd/blog/368769

使用DOM4J读和写文档相关推荐

  1. .net编写抽奖的文档_使用开源文档工具docsify,用写博客的姿势写文档

    前提 ❝ 下面的简介摘抄自docsify的官网 https://docsify.js.org 中的简介 ❞ 「docsify」是一个神奇的文档网站生成器.他可以快速帮你生成文档网站.不同于GitBoo ...

  2. 从程序员到项目经理(二十九):怎样写文档

    在软件项目中,文档既是一项的重要成果,也是项目管 理的有力工具.通过文档,可以稳定.明确的传达信息,实现项目内的有效沟通.所以写文档对项目经理来说,是一项必备的技能. 然而很多项目经理害怕写文档,似乎 ...

  3. 程序员写文档的重要性

    写文档的重要性 对于软件相关行业,在学校或单位大家也许都已经注意到了,除了要编写的程序.绘制设计图之外,还有一个重要的工作便是写文档.为什么要写文档呢?因为我们要把自己做的东西展示出来,不光展示给同行 ...

  4. 不给代码写文档,让代码文档化

    这是程序员讨论了很久的一个话题:要不要给代码写文档?值得给代码写文档吗? 我曾经觉得这个话题实在是让人难以应付.也认为除去一些特殊的情况(比如编写公用 API),代码文档并不是那么必要.直到有一天,我 ...

  5. 工作中写文档的一些经验总结

    工作中写文档的一些经验总结 在工作中,有很多时间是在写设计文档.配置说明.升级部署等文档. 有时候真的很烦写文档,但是写文档又是必不可少的重要工作内容. 如何写好文档? 我个人在工作中有一丢丢的经验总 ...

  6. 为什么程序员都不写文档?

    ‍‍‍ ‍ [CSDN 编者按]对于程序员来说文档可能是他最大的软肋.一些被称之为高手的程序员,往往是文档方面的处理会偏弱.不管这个程序员是在大公司.还在小公司.不管程序是写文档的.还是不写文档的,大 ...

  7. 如何理解写文档这件事情 ?

    目录 目录 前言 对公司而言 标准化流程 最佳实践 对自己而言 前言 个人札记, 写下对 写文档 这件事情的理解, 欢迎讨论. 对公司而言 文档系统是 标准化流程 和 最佳实践 的温床. 我们不仅是在 ...

  8. 程序员都讨厌写文档?这4个工具让你事半功倍

    长按识别上方二维码,关注公众号:后端面试那些事 回复"报告",获取你的GitHub年度报告! 对于一般的程序员来说,花费数小时来创建代码或修改现有代码只是一天工作中的一部分,简而言 ...

  9. python如何读取公共盘的文档_如何使用 Sphinx 给 Python 代码写文档 | Linux 中国

    最好将文档作为开发过程的一部分.Sphinx 加上 Tox,让文档可以轻松书写,并且外观漂亮.-- Moshe Zadka Python 代码可以在源码中包含文档.这种方式默认依靠 docstring ...

最新文章

  1. python3 系统监控脚本(CPU,memory,网络,disk等)
  2. selector + drawable 多状态图形
  3. QT的QWinThumbnailToolBar类的使用
  4. 做好一个team leader的几点看法
  5. Java即时编译器JIT之简单介绍
  6. 解决nginx部署后css、js、图片等样式不加载的问题
  7. csv逗号分隔符转换_机器学习Python实践——数据导入(CSV)
  8. Linux系统管理(7)——Linux单用户模式详解 及应用场景
  9. 10 月全国程序员工资统计,一半以上的职位 5 个月没招到人!
  10. Windows 2000活动目录详解之基础篇
  11. webmin安装_如何在Ubuntu 18.04上安装Webmin
  12. awstats的简单配置
  13. ubuntu 使用gspca安装摄像头
  14. 三菱PLC Q系列大型程序伺服12轴Q01U RS232通讯CCD 应用
  15. java9在win10下环境变量设置笔记
  16. 单元词检索计算机,截词检索
  17. hexo博客首页添加网易云音乐
  18. LeaRun快速开发平台,快速开发.net/java项目
  19. 使用xiaopiu常见技巧
  20. 联合概率数据互联(JPDA) ----多假设跟踪(MHT)

热门文章

  1. make: *** [ext/fileinfo/libmagic/apprentice.lo] Er
  2. Go 1.9 新特性
  3. 汇编程序:输数字,出字母
  4. Android 应用程序集成FaceBook 登录及二次封装
  5. 使用cookie解决微信不能存储localStorage的问题
  6. RHCE 学习笔记(7) 进程管理
  7. ADSL路由器防止******
  8. 对DBF的操作建议用微软的驱动和新的链接字符串。
  9. python hashlib模块
  10. iOS将产品进行多语言发布,开发