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
时间: 2024-10-13 10:36:48