- 浏览: 407365 次
- 性别:
- 来自: 哈尔滨
最新评论
-
springdata_springmvc:
如何在java Web项目中开发WebService接口,地址 ...
JAVA6开发WebService (二)——JAX-WS例子 -
springdata-jpa:
如何在java Web项目中开发WebService接口,地址 ...
JAVA6开发WebService (三)——几个概念 -
springmvc-freemarker:
如何在java Web项目中开发WebService接口,地址 ...
JAVA6开发WebService (一) -
yuanfen2014:
[color=red][/color] 学习了
jdom解析xml -
di1984HIT:
我很喜欢你对设计模式的理解。
JAVA设计模式学习笔记5——模版方法模式(Template Method Pattern)
dom4j和jdom都是非常优秀的xml解析工具,但现在很多人认为dom4j无论是在性能上或是灵活性上都要优于jdom,其实,作为xml的解析工具,他们在大多情况下都能满足我们的要求。至于要选择使用哪一个,那就要依个人爱好(或是公司要求)了。
以前写了一个jdom解析xml 的例子,仿照那篇,再写一个dom4j版本的。
我下载的是dom4j-1.6.1.zip,解压后可以看到里面有个dom4j-1.6.1.jar,为了方便,要使用了XPath的寻址方式时,需要引入jaxen-1.1-beta-6.jar(在lib文件夹中)。引入了这两个包,就可以开始操作xml文件了。dom4j的包11M多,超过限制了,此处只把例子中用到的两个jar包传上来。
dom4j-1.6.1.zip的下载地址为http://sourceforge.net/projects/dom4j/
下面分别对应读、写、修改写了三个例子。
一、读取xml文件
假设有这样一个xml文件:
<?xml version="1.0" encoding="UTF-8"?> <sys-config> <jdbc-info> <driver-class-name>oracle.jdbc.driver.OracleDriver</driver-class-name> <url>jdbc:oracle:thin:@localhost:1521:database</url> <user-name>why</user-name> <password>why</password> </jdbc-info> <provinces-info> <province id="hlj" name="黑龙江"> <city id="harb">哈尔滨</city> <city id="nj">嫩江</city> </province> <province id="jl" name="吉林"></province> </provinces-info> </sys-config>
首先,我们需要获得要解析的xml文件。dom4j提供DOMReader和SAXReader两种不同方式获取xml文件,但他们的调用方式是一样的。reader的read方法是重载的,可以从InputStream, File, Url等多种不同的源来读取,会返回一个org.dom4j.Document对象,得到的Document对象就带表了整个XML。
然后,可以用document.getRootElement()方法来获取根节点,并从根节点开始遍历xml文档。当然,我们也可以越过此步骤,而使用XPath直接获得要操作的节点(这与jdom有一点区别,jdom需要先获得根节点才可以使用XPath方式进行遍历)。利用 document.selectNodes("nodeName") 可以取得xml中的任意制定的节点中的信息。如:
Element driverClassNameElement = (Element)document.selectSingleNode("//sys-config/jdbc-info/driver-class-name");
这样就取得了上面文件中的 <jdbc-info> 下的 <driver-class-name> 中的内容。
如果一个节点下有多个名称相同的子节点,可以用document.selectNodes()方法取得多个子节点的List,遍历这个List就可以操作各个子节点的内容了。org.dom4j.Element对象代表每个节点。
下面是我写的用dom4j读取上面xml文件的例子:
package com.why.dom4j; import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class ReadXml { /** * @param args */ public static void main(String[] args) { SAXReader saxReader = new SAXReader(); try { Document document = saxReader.read(new File("src/config.xml")); // Element rootEle = document.getRootElement();//获取根节点 Element driverClassNameElement = (Element)document.selectSingleNode("//sys-config/jdbc-info/driver-class-name"); String driverClassName = driverClassNameElement.getText(); System.out.println("driverClassName = " + driverClassName); List provinceList = document.selectNodes("//sys-config/provinces-info/province"); for(Iterator it = provinceList.iterator();it.hasNext();){ Element provinceEle = (Element)it.next(); String proId = provinceEle.attributeValue("id"); String proName = provinceEle.attributeValue("name"); System.out.println("provinceId = " + proId + " provinceName = " + proName); List cityEleList = (List)provinceEle.elements("city"); for(Iterator cityIt = cityEleList.iterator();cityIt.hasNext();){ Element cityEle = (Element)cityIt.next(); String cityId = cityEle.attributeValue("id"); String cityName = cityEle.getText(); System.out.println(" cityId = " + cityId + " cityName = " + cityName); } } } catch (DocumentException e) { e.printStackTrace(); } } }
二、写xml文件
首先,用DocumentHelper.createDocument()方法创建一个Document对象,并调用document.addElement()来创建一个根节点。
然后,用Element的addElement()为一个节点添加子节点,addAttribute()方法添加属性。
构造完xml文档结构后,使用org.dom4j.io.XMLWriter的write()方法,将构造好的文档输出到指定位置,当然,可以用org.dom4j.io.OutputFormat对生成的文档进行美化。
代码如下:
package com.why.dom4j; import java.io.FileWriter; import java.io.IOException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class WriteXML { /** * @param args */ public static void main(String[] args) { Document document = DocumentHelper.createDocument(); Element root = document.addElement("sys-config"); Element provinceEle = root.addElement("provinces-info") .addElement("province") .addAttribute("id","hlj") .addAttribute("name","黑龙江省"); Element cityEle1 = provinceEle.addElement("city"); cityEle1.addAttribute("id","harb"); cityEle1.addText("哈尔滨"); Element cityEle2 = provinceEle.addElement("city") .addAttribute("id","nj") .addText("嫩江"); // OutputFormat format = OutputFormat.createPrettyPrint();// 美化格式 OutputFormat format = OutputFormat.createCompactFormat();// 缩减格式 // format.setEncoding("UTF-8");// 设置编码格式 format.setIndent(" "); //缩进4个空格后换行 XMLWriter writer; try { writer = new XMLWriter(new FileWriter("src/output.xml"), format); writer.write(document); writer.close(); } catch (IOException e) { e.printStackTrace(); } String xmlStr = document.asXML(); System.out.println(xmlStr); // 也可以将字符串转XML // String text = "<sys-config><provinces-info><province>黑龙江省</province></provinces-info></sys-config>"; // Document document = DocumentHelper.parseText(text); } }
三、修改xml文件
以上面的xml为例,现进行三项修改:
1、在<province id="jl" name="吉林"></province>之间添加一个子节点<city id="jls">吉林市</city>:
首先取得id="jl"的province节点,然后调用addElement()方法添加子节点,与写文件操作相同,如:
province.addElement("city").addAttribute("id", "jls").addText("吉林市");
2、将<city id="harb">哈尔滨</city>的id属性改为“HaErBin”,内容改为“哈尔滨市”:
遍历所有的city节点,并取得其“id”属性:Attribute attribute = (Attribute)city.attribute("id");
若其“id”属性的值为“harb”,则调用其attribute属性的setValue()方法:attribute.setValue("HaErBin");并调用该city节点的setText()方法将其内容改为“哈尔滨市”。
3、删除<city id="nj">嫩江</city>节点:
取得id="nj"的city节点,并调用其父节点的remove()方法删除此节点:city.getParent().remove(city);
代码如下:
package com.why.dom4j; import java.io.File; import java.io.FileOutputStream; 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.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class ModifyXml { /** * @param args */ public static void main(String[] args) { SAXReader saxReader = new SAXReader(); File file = new File("src/config.xml"); try { Document document = saxReader.read(file); List provinceList = (List)document.selectNodes("//sys-config/provinces-info/province"); for(Iterator it = provinceList.iterator();it.hasNext();){ Element province = (Element)it.next(); Attribute attribute = (Attribute)province.attribute("id"); System.out.println(attribute.getValue()); if(attribute.getValue().equals("jl")){ System.out.println(province.getText()); province.addElement("city") .addAttribute("id", "jls").addText("吉林市"); } } List cityList = (List)document.selectNodes("//sys-config/provinces-info/province/city"); for(Iterator it = cityList.iterator();it.hasNext();){ Element city = (Element)it.next(); Attribute attribute = (Attribute)city.attribute("id"); System.out.println(attribute.getValue()); if(attribute.getValue().equals("harb")){ attribute.setValue("HaErBin"); System.out.println(city.getText()); city.setText("哈尔滨市"); } if(attribute.getValue().equals("nj")){ city.getParent().remove(city); } } OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8");// 设置编码格式 format.setIndent(" "); //缩进4个空格后换行 XMLWriter writer = new XMLWriter(new FileOutputStream(file),format); writer.write(document); writer.close(); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Invalid byte 1 of 1-byte UTF-8 sequence的解决办法:
将new XMLWriter(new FileWriter("src/output.xml"), format);改为:
new XMLWriter(new FileOutputStream("src/output.xml"), format);
为避免程序中出现中文乱码问题,也可以将xml文件以及程序中设置的编码格式统一改为GBK,有关中文乱码的问题,可以参考http://kevin-qingzhan.iteye.com/blog/473994
- dom4j-1.6.1.jar (306.5 KB)
- 下载次数: 24
- jaxen-1.1-beta-6.jar (238.6 KB)
- 下载次数: 38
发表评论
-
CKFinder2.x 入门 二
2011-07-08 17:28 11404破解 CKFinder是收费的,可是我们都比较 ... -
CKFinder2.x 入门
2011-07-08 16:04 6427CKFinder是一款强大的基于浏览器的ajax文件管 ... -
jxl 操作 Excel
2011-06-09 12:06 9780java 操作 Excel 最常用的就是JXL(jav ... -
CKEditor 3.6 入门二
2011-05-23 18:11 5541配置CKEditor ... -
CKEditor 3.6 入门
2011-05-20 11:28 8343有多种方法可以将CKEditor集成到你的页面中,下面是 ... -
JAVA6开发WebService (五)—— JAXB
2011-01-25 16:55 7000JAXB(Java API for XML Bindi ... -
多线程断点续传
2011-01-12 12:20 3799以前看过一个前辈写的断点续传的文章,记得当时没看懂,就 ... -
JAVA6开发WebService (四)——SAAJ调用WebService
2010-11-13 14:32 8645前面写了个JAX-WS的小例子,看到用JAVA6开发W ... -
JAVA6开发WebService (三)——几个概念
2010-11-11 17:00 18753要了解WebService,光能写 ... -
JAVA6开发WebService (二)——JAX-WS例子
2010-11-10 17:13 19792上一篇写了个最简单的小例子,只是为了说明JAVA6开发 ... -
JAVA6开发WebService (一)
2010-11-10 12:32 36104WebService ... -
InputStream、OutputStream、String的相互转换
2010-11-09 16:37 474751、字符串转inputStream String ... -
正则表达式
2010-05-17 16:39 1820先看一个用正则表达式校验Email的js方法 func ... -
Struts 1 和 Struts 2 的线程安全
2010-03-23 16:58 5738昨天人问我Struts 2是怎么保证全局变量的线程安全 ... -
oracle 字符串函数
2010-02-22 10:59 26371.LOWER 返回字符串的小写形式;select lower ... -
JAVA 集合类
2010-01-06 16:41 1316Collection├List│├LinkedLi ... -
JAVA 线程学习笔记--同步
2009-12-30 16:37 1576为了确保可以在线程之间以受控方式共享数据,Java 语言提供了 ... -
JAVA 线程学习笔记
2009-12-30 16:26 2937创建线程有两种方法。 ... -
JAVA调用系统命令或可执行程序
2009-09-03 15:33 69723通过 java.lang.Runtime 类可以方便的 ... -
FTP客户端(利用sun.net.ftp.FtpClient实现)
2009-07-30 15:35 25963昨天帮同事弄java上传文件到ftp服务器,用的sun ...
相关推荐
### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...
使用 dom4j 解析 XML dom4j 解析 XML dom4j解析xml
**DOM4J解析XML** DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活、高效且功能丰富的API,使得XML的读取、创建、修改和查询变得简单易行。DOM4J的主要特点包括对XPath的支持、事件驱动的解析、以及与...
Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得开发者能够方便地读取、写入、修改以及操作XML文件。DOM4J是Java中一个非常强大的XML处理库,它结合了DOM、SAX和JDOM的优点,同时也...
在“dom4j解析xml文件(增删改查)”这个主题中,我们将深入探讨如何使用DOM4J来实现XML文档的四种基本操作:增加元素、删除元素、更新元素内容以及查询元素。 首先,让我们了解DOM4J的基本用法。在解析XML文件时,...
**DOM4J解析XML实例详解** 在Java编程中,处理XML文档是一项常见的任务。DOM4J是一个非常流行的、强大的Java XML API,它提供了灵活且高效的方式来解析、创建、修改XML文档。本文将深入探讨如何使用DOM4J进行XML...
在这个实例中,我们将深入探讨如何使用DOM4J解析XML文件,并通过`Dom4jTest1.java`这个示例程序来理解其工作原理。 首先,我们需要了解XML(Extensible Markup Language)是一种标记语言,常用于存储和传输数据。...
本人自己研究的解析方法,主要用dom4j解析XML文件,进而获取里面的信息
通过这种方式,我们可以利用DOM4J解析XML文件,同时借助Java反射机制将解析结果动态地映射到自定义的Java类中。这在处理XML数据时提供了很大的灵活性,尤其在需要将XML数据与业务对象关联时,反射机制显得尤为重要。
在本示例中,我们将深入探讨如何使用DOM4J解析XML文件,以`CacheInit.java`作为我们的核心代码示例,并参考`emailTemplateConfig.xml`作为实际操作的对象。 首先,让我们了解XML(eXtensible Markup Language)。...
1. **DOM4J解析XML**:DOM4J通过创建一个可操作的树形结构来表示XML文档,这棵树称为文档对象模型。解析XML时,DOM4J首先读取XML文件并构建一个节点结构,然后你可以通过API遍历和修改这个结构。例如,你可以通过...
【使用dom4j解析XML】 dom4j是一个强大的开源XML框架,它提供了处理XML文档的各种功能,包括解析、创建、修改等。相比W3C DOM API,dom4j的优势在于其内置的XPath支持,允许更方便地定位和操作XML文档中的节点。 *...
1、xml文档解析 2、 dom4j解析xml 3、实现xml文件解析 xml字符串解析 xml MAP键值对解析 4、实现xml写入与生成文件
为了在Java项目中使用DOM4J解析XML,你需要将这两个jar文件(dom4j-1.6.1和jaxen-1.1-beta-7.jar)添加到你的类路径(classpath)中。这可以通过在IDE中配置构建路径,或者在命令行中指定 `-cp` 参数来完成。一旦...
在本实例中,我们将深入探讨如何使用DOM4J解析XML,并利用这些数据连接Oracle数据库进行数据操作。 首先,让我们了解DOM4J的基本用法。DOM4J的主要类包括`Document`、`Element`、`Attribute`和`Namespace`。`...
2. **XML解析**:DOM4J支持多种解析方式,包括SAX(Simple API for XML)和DOM。SAX是基于事件的解析,适用于处理大文件;DOM则将整个XML文档加载到内存,适合小规模或内存允许的情况。DOM4J还提供了StAX(Streaming...
dom4j解析xml字符串实例