Dom4j是一个非常非常优秀的Java XML API,用来读写XML文件,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。对主流的Java XML API进行的性能、功能和易用性的评测,Dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如hibernate,包括sun公司自己的JAXM也用了Dom4j。

主要介绍Dom4j的基础操作,结合实例说明。

目录结构:

关键代码:

package com.alfred.main;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; import com.alfred.util.Dom4jUtil; public class Main { public static void main(String[] args) throws Exception {
// 获取document对象,三种方法
Document doc = Dom4jUtil.getDocument(); // 打印文档结构
// Dom4jUtil.printDocument(doc); // 打印文档的结构 使用dom4j输出重定向
Dom4jUtil.printDocumentByDom4j(doc); // 对节点的操作
// elementOper(doc); // 对节点属性的操作
// elementAttributeOper(doc); // 将document写入文件
// writeDocumentToXml(doc); // document的其他操作
// documentOtherOper(); } /**
* 对节点的操作
*
* @param doc
*/
private static void elementOper(Document doc) {
// 获取文档的根节点
Element root = doc.getRootElement(); // ===========================查询 begin
// 获取某个节点的子节点
Element position = root.element("position");
// 获取节点的文字内容 position.getTextTrim();去掉前后空格
String positionText = position.getText();
System.out.println("positionText:" + positionText); Element employees = root.element("employees");
// 获取某节点下所有名为“employee”的子节点,并进行遍历
List employeeList = employees.elements("employee");
for (Iterator it = employeeList.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
}
// 获取某节点下所有子节点
List elementList = employees.elements(); // 对某节点下的所有子节点进行遍历
for (Iterator it = employees.elementIterator(); it.hasNext();) {
Element element = (Element) it.next();
}
// ===========================查询 end // ===========================新增 begin
// 在某节点下添加子节点
Element compbirthday = root.addElement("compbirthday");
// 设置节点内容
compbirthday.setText("1970-10-10");
// 添加CDATA内容
compbirthday.addCDATA("cdata区域");
// ===========================新增 end // ===========================删除 begin
Element name = root.element("name");
// 删除节点
boolean issuccess = root.remove(name);
// ===========================删除 end
} /**
* 对节点属性的操作
*
* @param doc
*/
private static void elementAttributeOper(Document doc) {
// 获取文档的根节点
Element root = doc.getRootElement();
// ===========================查询 begin
// 获取节点
Element name = root.element("name");
// 获取某节点下的某属性
Attribute scale = name.attribute("scale");
// 获取属性的内容
String scaleText = scale.getText();
// 遍历某节点的所有属性
for (Iterator it = root.attributeIterator(); it.hasNext();) {
Attribute attribute = (Attribute) it.next();
}
// 获取某节点下所有属性
List attributeList = name.attributes();
// 获取某节点下某个属性的值,如果不存在该属性则返回null
String abbrValue = name.attributeValue("abbr");
// 获取某节点下某个属性的值,如果不存在该属性则返回设置的默认值
String abbrnewValue = name.attributeValue("abbrnew", "IBMNEW");
// ===========================查询 end // ===========================新增 begin
// 设置某节点的属性和内容 如果不存在则新增属性
name.addAttribute("scale", "1100");
name.addAttribute("scalewish", "1300");
// 设置属性的内容
name.setText("1200");
// ===========================新增 end // ===========================删除 begin
// 删除节点属性
boolean issuccess = name.remove(scale);
// ===========================删除 end
} /**
* 将document写入文件
*
* @param doc
* @throws IOException
*/
private static void writeDocumentToXml(Document doc) throws IOException {
// 不设置编码,直接写入的形式
// XMLWriter writer = new XMLWriter(new
// FileWriter("source/newtest.xml"));
// writer.write(doc);
// writer.flush();
// writer.close(); // 设置编码格式写入的形式(当文档中存在中文的时候)
// 创建文件输出的时候,紧凑的格式
// OutputFormat format = OutputFormat.createCompactFormat();
// 创建文件输出的时候,自动缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("UTF-8");
// 创建XMLWriter对象,指定写出文件及编码格式
// XMLWriter writerEncoding = new XMLWriter(new
// FileWriter("source/newtest_encoding.xml"), format);
XMLWriter writerEncoding = new XMLWriter(new OutputStreamWriter(
new FileOutputStream(new File("source/newtest_encoding.xml")),
"UTF-8"), format);
// 写入
writerEncoding.write(doc);
// 立即写入
writerEncoding.flush();
// 关闭操作
writerEncoding.close();
} /**
* document的其他操作
*
* @param doc
* @throws DocumentException
*/
private static void documentOtherOper() throws DocumentException {
// ===========================字符串与XML的转换 begin
// 将字符串转化为XML
String xml = "<develop><java>java 语言</java></develop>";
Document document = DocumentHelper.parseText(xml);
// 将文档或节点的XML转化为字符串
SAXReader reader = new SAXReader();
Element root = document.getRootElement();
String docXmlText = document.asXML();
String rootXmlText = root.asXML();
Element memberElm = root.element("java");
String memberXmlText = memberElm.asXML();
// ===========================字符串与XML的转换 end
} }

Main.java

package com.alfred.util;

import java.io.File;
import java.io.IOException;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; /**
* dom4j工具类
*
* @author alfredinchange
*
*/
public class Dom4jUtil { private static String tabchar = " "; /**
* 获取dom4j的文档对象 总共有三种方式:读取文件,解析xml字符串,生成新的文档对象
*
* @return
* @throws DocumentException
*/
public static Document getDocument() throws DocumentException {
// 读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("source/test.xml")); // 解析XML形式的文本,得到document对象
// String xml = "<company><name>IBM</name></company>";
// Document doc = DocumentHelper.parseText(xml); // 主动创建document对象
// Document doc = DocumentHelper.createDocument();
// Element root = doc.addElement("company");
// Element name = root.addElement("name");
// name.setText("IBM"); return doc;
} /**
* 打印文档的结构 使用dom4j输出重定向
*
* @param doc
* @throws IOException
*/
public static void printDocumentByDom4j(Document doc) throws IOException {
// 创建文件输出的时候,自动缩进的格式
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码
format.setEncoding("UTF-8");
XMLWriter writer = new XMLWriter(System.out, format);
writer.write(doc);
writer.flush();
writer.close();
} /**
* 打印文档的结构
*
* @param doc
* 文档对象
*/
public static void printDocument(Document doc) {
Integer tabcnt = 1; // 获取文档对象根节点
Element root = doc.getRootElement();
System.out.print("<" + root.getName() + getElementAttribute(root) + ">"
+ root.getTextTrim());
/**
* root.elements():取得某节点下所有的子节点
* root.elements("employees"):取得某节点下所有名为"employees"的子节点
*/
List rootElements = root.elements();
if (rootElements.size() != 0) {
System.out.println();
}
for (Object obj : rootElements) {
Element element = (Element) obj;
/**
* element.getName():获取节点名称 element.getText():获取节点内容
* element.getTextTrim():获取节点内容,去掉前后空格
*/
System.out.print(StringUtil.copyString(tabchar, tabcnt) + "<"
+ element.getName() + getElementAttribute(element) + ">"
+ element.getTextTrim());
boolean flag = printElement(element, tabcnt);
System.out.print((flag ? StringUtil.copyString(tabchar, tabcnt)
: "")
+ "</" + element.getName() + ">");
System.out.println();
}
System.out.print("</" + root.getName() + ">");
} /**
* 打印节点的结构
*
* @param element
* 节点对象
* @param tabcnt
* 节点前的tab数目
*/
private static boolean printElement(Element element, Integer tabcnt) {
tabcnt++;
List elements = element.elements();
if (elements.size() != 0) {
System.out.println();
}
for (Object obj : elements) {
Element el = (Element) obj;
System.out.print(StringUtil.copyString(tabchar, tabcnt) + "<"
+ el.getName() + getElementAttribute(el) + ">"
+ el.getTextTrim());
boolean flag = printElement(el, tabcnt);
System.out.print((flag ? StringUtil.copyString(tabchar, tabcnt)
: "")
+ "</" + el.getName() + ">");
System.out.println();
}
return elements.size() != 0;
} /**
* 获取节点属性
*
* @param root
* @return
*/
private static String getElementAttribute(Element element) {
StringBuffer sb = new StringBuffer();
// 取得某节点的所有属性
List attributes = element.attributes();
for (Object obj : attributes) {
Attribute attribute = (Attribute) obj;
/**
* attribute.getName():获取属性名称 attribute.getText():获取属性内容
*/
sb.append(" " + attribute.getName() + "=\"" + attribute.getText()
+ "\"");
}
return sb.toString();
} }

Dom4jUtil.java

package com.alfred.util;

/**
* 字符串操作工具类
*
* @author alfredinchange
*
*/
public class StringUtil { /**
* 字符串拷贝
* @param str 源字符串
* @param cnt 拷贝次数
* @return
*/
public static String copyString(String str,Integer cnt){
StringBuffer sb = new StringBuffer();
while(cnt != null && cnt > 0){
sb.append(str);
cnt--;
}
return sb.toString();
} }

StringUtil.java

<?xml version="1.0" encoding="UTF-8"?>
<company>
<name scale="1000" abbr="ibm">IBM</name>
<position>USA</position>
<employees count="2">
<employee>
<username>alfred01</username>
<fullname>这是测试呀</fullname>
<age>22</age>
<birthday>1990-10-11</birthday>
</employee>
<employee>
<username>alfred02</username>
<fullname>中文会不会出错呀</fullname>k
<age>25</age>
<birthday>1993-01-02</birthday>
</employee>
</employees>
</company>

test.xml

最新文章

  1. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析
  2. Error: unable to connect to node rabbit@mail: nodedown
  3. C#中的数组,多维数组和交错数组
  4. Target:IG
  5. PetShop的系统架构设计
  6. Intellij IDEA 快捷键(Mac)
  7. 替换SearchBar 键盘上的 搜索 按钮
  8. js 多选题选项内容显示在标题下
  9. ajax简单案例:返回json型
  10. android 解析XML方式(二)
  11. ajax get/post
  12. ceph理论及部署配置实践
  13. CSS学习总结
  14. 洛谷 [P1129] [ZJOI2007] 矩阵游戏
  15. Spring源码分析(一)--BeanProcessor
  16. FluentDataflow - Fluent Style TPL Dataflow
  17. PHP——判断是否为加密协议https
  18. js文档就绪函数
  19. samba服务配置(一)
  20. gitlab-ci的注意点

热门文章

  1. Zuul小技巧 /routes
  2. 使用MegaCli监控Linux硬盘
  3. js 原型链和继承(转)
  4. laravel5.8笔记六:公共函数和常量设置
  5. rabbitmq消费端加入精确控频。
  6. Centos7 php-fpm root 运行,执行 kill 等系统命令
  7. MQTT 嵌入式端通讯协议解析(转)
  8. pushd和popd
  9. 强制不使用“兼容性视图”的HTML代码
  10. word2vec生成词向量和字向量