- 浏览: 20977 次
- 性别:
- 来自: 衡阳
文章分类
最新评论
本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。
1. 下载与安装
dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。
可以到http://sourceforge.net/projects/dom4j下载其最新版。
dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。
2. 示例XML文档(holen.xml)
为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。
- holen.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <books>
- <!--This is a test for dom4j, holen, 2004.9.11-->
- <book show="yes">
- <title>Dom4j Tutorials</title>
- </book>
- <book show="yes">
- <title>Lucene Studing</title>
- </book>
- <book show="no">
- <title>Lucene in Action</title>
- </book>
- <owner>O'Reilly</owner>
- </books>
这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。
3. 建立一个XML文档
- /**
- * 建立一个XML文档,文档名由输入属性决定
- * @param filename 需建立的文件名
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int createXMLFile(String filename){
- /** 返回操作结果, 0表失败, 1表成功 */
- int returnValue = 0;
- /** 建立document对象 */
- Document document = DocumentHelper.createDocument();
- /** 建立XML文档的根books */
- Element booksElement = document.addElement("books");
- /** 加入一行注释 */
- booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
- /** 加入第一个book节点 */
- Element bookElement = booksElement.addElement("book");
- /** 加入show属性内容 */
- bookElement.addAttribute("show","yes");
- /** 加入title节点 */
- Element titleElement = bookElement.addElement("title");
- /** 为title设置内容 */
- titleElement.setText("Dom4j Tutorials");
-
- /** 类似的完成后两个book */
- bookElement = booksElement.addElement("book");
- bookElement.addAttribute("show","yes");
- titleElement = bookElement.addElement("title");
- titleElement.setText("Lucene Studing");
- bookElement = booksElement.addElement("book");
- bookElement.addAttribute("show","no");
- titleElement = bookElement.addElement("title");
- titleElement.setText("Lucene in Action");
-
- /** 加入owner节点 */
- Element ownerElement = booksElement.addElement("owner");
- ownerElement.setText("O'Reilly");
-
- try{
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
- return returnValue;
- }
说明:
Document document = DocumentHelper.createDocument();
通过这句定义一个XML文档对象。
Element booksElement = document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
l addComment:添加注释
l addAttribute:添加属性
l addElement:添加子元素
最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。
生成后的holen.xml文件内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>
4. 修改XML文档
有三项修改任务,依次为:
l 如果book节点中show属性的内容为yes,则修改成no
l 把owner项内容改为Tshinghua,并添加date节点
l 若title内容为Dom4j Tutorials,则删除该节点
- /**
- * 修改XML文件中内容,并另存为一个新文件
- * 重点掌握dom4j中如何添加节点,修改节点,删除节点
- * @param filename 修改对象文件
- * @param newfilename 修改后另存为该文件
- * @return 返回操作结果, 0表失败, 1表成功
- */
- public int ModiXMLFile(String filename,String newfilename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- /** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
- /** 先用xpath查找对象 */
- List list = document.selectNodes("/books/book/@show" );
- Iterator iter = list.iterator();
- while(iter.hasNext()){
- Attribute attribute = (Attribute)iter.next();
- if(attribute.getValue().equals("yes")){
- attribute.setValue("no");
- }
- }
-
- /**
- * 修改内容之二: 把owner项内容改为Tshinghua
- * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type
- */
- list = document.selectNodes("/books/owner" );
- iter = list.iterator();
- if(iter.hasNext()){
- Element ownerElement = (Element)iter.next();
- ownerElement.setText("Tshinghua");
- Element dateElement = ownerElement.addElement("date");
- dateElement.setText("2004-09-11");
- dateElement.addAttribute("type","Gregorian calendar");
- }
-
- /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
- list = document.selectNodes("/books/book");
- iter = list.iterator();
- while(iter.hasNext()){
- Element bookElement = (Element)iter.next();
- Iterator iterator = bookElement.elementIterator("title");
- while(iterator.hasNext()){
- Element titleElement=(Element)iterator.next();
- if(titleElement.getText().equals("Dom4j Tutorials")){
- bookElement.remove(titleElement);
- }
- }
- }
-
- try{
- /** 将document中的内容写入文件中 */
- XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
-
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
说明:
List list = document.selectNodes("/books/book/@show" );
list = document.selectNodes("/books/book");
上述代码通过xpath查找到相应内容。
通过setValue()、setText()修改节点内容。
通过remove()删除节点或属性。
5. 格式化输出和指定编码
默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。
- /**
- * 格式化XML文档,并解决中文问题
- * @param filename
- * @return
- */
- public int formatXMLFile(String filename){
- int returnValue = 0;
- try{
- SAXReader saxReader = new SAXReader();
- Document document = saxReader.read(new File(filename));
- XMLWriter writer = null;
- /** 格式化输出,类型IE浏览一样 */
- OutputFormat format = OutputFormat.createPrettyPrint();
- /** 指定XML编码 */
- format.setEncoding("GBK");
- writer= new XMLWriter(new FileWriter(new File(filename)),format);
- writer.write(document);
- writer.close();
- /** 执行成功,需返回1 */
- returnValue = 1;
- }catch(Exception ex){
- ex.printStackTrace();
- }
- return returnValue;
- }
说明:
OutputFormat format = OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。
format.setEncoding("GBK");
指定编码为GBK。
XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。
6. 完整的类代码
前面提出的方法都是零散的,下面给出完整类代码。
- Dom4jDemo.java
- package com.holen.dom4j;
- import java.io.File;
- import java.io.FileWriter;
- import java.util.Iterator;
- import java.util.List;
- import org.dom4j.Attribute;
- import org.dom4j.Document;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.OutputFormat;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- //如果是UTF-8 FileWriter 改用 FileOutputStream
- public class Dom4jDemo{
- public Dom4jDemo (){}
- }
相关推荐
用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。
换句话说:XML DOM 是用于获取、更改、添加或删除 XML 元素的标准。 模块简介: 1、XMLDOMDocument类: XML对象文档 ->操作创建或读写(元素、节点、属性、注释)等 2、IXMLDOMNode类:每个元素或节点基本都会有的...
* Dom4j(SAX)读取xml数据(解析) * @param params * @throws Exception */ private static List<Pois> getReaderXml(String flg) throws Exception{ String fromRead=Dom4jTest2.class.getClassLoader...
今天小编就为大家分享一篇用dom4j生成xml,去掉xml头的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
} <br> /** * 修改XML文件中内容,并另存为一个新文件 * 重点掌握dom4j中如何添加节点,修改节点,删除节点 * @param filename 修改对象文件 * @param newfilename 修改后另存为该文件 * @...
1.使用DOMParser解析xml 2.递归遍历xml树,按格式输出每一个节点 关于使用DOMParser 此方法目前在IE9以上和其它浏览器里都是支持的,所以这里不在写关于IE9以下不支持的情况, 具体的使用请跳转 ...
3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...
3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...
对XML文件的要求,格式良好(符合XML的语法要求),有效的XML; XML的用途,数据传输的中间件,做为通用文档格式 1,数据交换 2,web服务 3,内容管理 4,web集成 5,充当配置文件 格式良好的XML文件的规范 XML...
DWR 自动将DOM、DOM4J、JDOM和XOM转换成DOM树,前面这几种类型都仅仅返回Document,Element,Node.DWR会自动将这些转换成浏览器DOM对象.通常在启动JDOM Converter时会有一个提示信息,除非你想采用JDOMconverter否则可以...
3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...
简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言“(eXtensible Markup Language)。它允许你创建你自己的文档标记。在为浏览器标记文档...
它使用浏览器的 DOMParser(在 IE 的情况下使用 XMLDOM ActiveX 组件)。 没有像 X2JS 这样的依赖。 安装 bower install --save angular-xml2js XML JSON 示例 对于以下 XML 文档 <?xml version="1.0"?> ...
1.6.1 格式正规的XML 1.6.2 文档类型定义 1.6.3 数据建模 1.6.4 文档对象模型 1.6.5 XML 简单API 1.6.6 命名空间和模式 1.6.7 链接和查询 1.6.8 转换XML 1.6.9 XML和数据库 1.6.10 服务器到服务器 1.6.11 ...
3.2.4 用dom解析xml文档实例 53 3.3 使用sax解析xml文档 65 3.3.1 sax的处理机制 66 3.3.2 配置sax解析器 69 3.3.3 sax解析器工厂 70 3.3.4 sax的异常类 71 3.3.5 errorhandler接口 73 3.3.6 使用sax解析xml...
xstream可以完美转换xml,与以往的解析xml工具dom相比,xstream是一个易用的、开源 的库,使用起来简单、小巧,容易理解,可以轻易的将java对象和xml文档相互转换,而 且可以修改某个特定的属性和节点名称。...
单独用XMl不能显示页面,我们使用格式化技术,比如CSS或者XSL,才能显示XML标记创建的文档。 我们在前面第一章讲到XML是将数据和格式分离的。XML文档本身不知道如何来显示,必须有辅助文件来帮助实现。(XML取消了...
% _ [abc1-9]格式字符串 * * @param format * 格式字符串 如:邮箱:%@%_ * @param value * 被判断的值 yiyongpeng@tom.com * @return 是否匹配 */ public boolean like(String format, String value){} ...
此程序实现的功能:利用QT库提供的DOM方式来读取和解析数字化保护装置的XML格式的配置文件。
1.6.1 格式正规的XML 1.6.2 文档类型定义 1.6.3 数据建模 1.6.4 文档对象模型 1.6.5 XML 简单API 1.6.6 命名空间和模式 1.6.7 链接和查询 1.6.8 转换XML 1.6.9 XML和数据库 1.6.10 服务器到服务器 1.6.11 ...