zoukankan      html  css  js  c++  java
  • 信步漫谈之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
  • 相关阅读:
    Java中使用Jedis连接Redis对Hash进行操作的常用命令
    Java中使用Jedis连接Redis对Set进行操作的常用命令
    Java中使用Jedis连接Redis对List进行操作的常用命令
    Android中获取定位经纬度信息
    Java中使用Jedis连接Redis对String进行操作的常用命令
    Java中使用Jedis连接Redis对Key进行操作的常用命令
    Java中使用Jedis连接池连接Redis数据库流程
    Java中使用Jedis连接Redis数据库流程
    Java中使用Jedis连接Redis服务端时提示:JedisConnectionException: Failed connecting
    调用百度翻译对句子进行翻译
  • 原文地址:https://www.cnblogs.com/alfredinchange/p/5572979.html
Copyright © 2011-2022 走看看