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

Dom4j基础的更多相关文章

  1. dom4j基础教程【转】

    转自 http://blog.csdn.net/whatlonelytear/article/details/42234937 ,但经过大量美化及补充. Dom4j是一个易用的.开源的库,用于XML, ...

  2. Dom4j使用Xpath语法读取xml节点

    我们可以使用Xpath的语法来轻易的读取xml的某个节点[类似于jQuery的选择器]: 使用Xpath语法需要添加新的jaxen-1.1-beta-7.rar 这个jar包 dom4j完整jar包我 ...

  3. 2016年终分析(传统开发与网络时代的Java开发)

    2016重大事件:(在此将2016年的开发称为传统开发) 1.乌镇互联网大会大会(大数据&云计算) 2.某东struts2安全漏洞 3.作为一个程序呀对于淘宝双11和双12的分析应该是最好的案 ...

  4. 【Java】解析Java对XML的操作

    目录结构: contents structure [+] 什么是XML 解析XML 使用DOM解析 使用SAX解析 使用PULL解析 使用dom4j解析xml dom4j的部分API 打印一个XML文 ...

  5. XML基础以及用DOM4j读取数据

    都知道,HTML被设计用来显示数据,XML被设计用来保存.数据传输.而我们平时经经常使用的无非是保存数据.读取数据.所以这里主要介绍XML相关基础内容.以及用DOM4j来存取XML的数据. 以下简单介 ...

  6. java基础73 dom4j修改xml里面的内容(网页知识)

    1.DOM4J对XML文件进行增删改操作 实现代码 package com.shore.code; import java.io.File; import java.io.FileOutputStre ...

  7. java基础 xml 使用dom4j解析 xml文件 servlet根据pattern 找到class

    package com.swift.kaoshi; import java.io.File; import java.util.List; import java.util.Scanner; impo ...

  8. [JavaWeb基础] 031.dom4j写入xml的方法

    上一篇我们讲述了dom4j读取xml的4种方法,甚是精彩,那么怎么样写入xml呢?我们直接看下源码实现. public static void main(String[] args) throws E ...

  9. [JavaWeb基础] 030.dom4j读取xml的4种方法

    通常我们在项目开发的过程中经常要操作到xml文件,在JAVA这边,我们会很自然的联想到Dom4J这个apache的开源插件,那么我们使用Dom4J如何来读取xml文件呢?下面我们来看看以下4种方法 1 ...

随机推荐

  1. VS的ASP.NET项目中cshtml关键词出错 红线,当前上下文中不存在名称

    [参考]VS的ASP.NET项目中cshtml突然出错,当前上下文中不存在名称“ViewBag” 原因:web.config 配置错误 这种情况是因为两个web.config文件版本不匹配,需要进行修 ...

  2. 24小时学通Linux内核之调度和内核同步

    心情大好,昨晚我们实验室老大和我们聊了好久,作为已经在实验室待了快两年的大三工科男来说,老师让我们不要成为那种技术狗,代码工,说多了都是泪啊,,不过我们的激情依旧不变,老师帮我们组好了队伍,着手参加明 ...

  3. OSG相关扩展工程

    https://blog.csdn.net/wang15061955806/article/details/51003803 OSG的相关扩展,OSG针对每个特定应用,也有很多的开发者进行开发和完善, ...

  4. [Codis] Codis3部署流程

    #0 前言 最近因为项目需要,研究了一下传说中的Codis.下面跟大家分享Codis3的搭建流程 https://github.com/CodisLabs/codis #1 Codis是什么 官方的介 ...

  5. poj 2069

    唔. 这道题的火候比较巧妙. 我们是每次找到一个最远的点,然后向那个最远点逼近. 这显然非常合理. #include <cstdlib> #include <cmath> #i ...

  6. gym 101657 D

    理论1A.  //没删debug的文件读入.. 傻逼题. 先求出来每条边两侧的三角形,然后枚举边,根据叉积判断三角形位置,建图,拓扑排序. #include <bits/stdc++.h> ...

  7. codechef cook 103 div2

    第一次打codechef...不太会用这oj. A: #include <bits/stdc++.h> #define mk(a,b) make_pair(a,b) #define pii ...

  8. 剑指offer——python【第21题】栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...

  9. 我了解到的新知识之---Cylance Protect是干吗的?

    每家企业都会采购适合自己的杀毒软件来保护企业内的电脑处在安全的状态下,我所在的公司目前在用的是来自美国的初创企业的产品Cylance Protect.,目前这家公司已经在2018年11月份被黑莓公司收 ...

  10. .NET Core 的 Span<T> 学习与使用笔记

    一.阅读材料 All About Span: Exploring a New .NET Mainstay Span<T> - byte to int conversions Span< ...