Dom4j基础

Posted 临渊启明

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dom4j基础相关的知识,希望对你有一定的参考价值。

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

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

目录结构:

image

关键代码:

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基础的主要内容,如果未能解决你的问题,请参考以下文章

Java解析XML之Dom4j

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

XML基础--DOM4J解析

DOM4J解析xml

dom4j的介绍

[vscode]--HTML代码片段(基础版,reactvuejquery)