1. dom4j概述
解析DOM4J是一个开源XML解析包,采用了Java集合框架并完全支持DOM,SAX和JAXP。
最大的特色是使用了大量的接口,主要接口都在org.dom4j里定义。
2. dom4j的使用
2.1 Doucment相关用法
2.11 解析XML文件,获得Document对象
SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml"));2.12 解析字符串,获得Document对象
String text = "<members></members>"; Document document = DocumentHelper.parseText(text);2.13 无脑自建Document对象
Document document = DocumentHelper.createDocument(); Element root = document.addElement("members");// 创建根节点
2.2 节点相关用法
2.21 获得文档根节点Element rootElm = document.getRootElement();2.22 获得某个节点下的指定子节点
Element memberElm = root.element("member");// "member"是节点名 root为某个节点2.23 获得节点下的文字
String text = memberElm.getText();
String text = root.elementText("name");2.24 遍历取得某节点下名为member的所有子节点
List nodes = rootElm.elements("member"); for (Iterator it = nodes.iterator(); it.hasNext();) { Element elm = (Element) it.next(); // do something }2.25 遍历取得某节点下的所有子节点
for (Iterator it = root.elementIterator();it.hasNext();){ Element element = (Element) it.next(); // do something }2.26 A节点下 Add/Delete B节点
Element B = A.addElement("age"); A.remove(B);
2.27 在根节点下添加一个CDATA节点
Element contentElm = root.addElement("content"); contentElm.addCDATA("Hello"); // 特别说明:获取节点的CDATA值与获取节点的值是一个方法 System.out.println("contentElm.getText() " + contentElm.getText());
2.3 属性相关用法
2.31 取得根节点下的某属性
Element root=document.getRootElement(); Attribute attribute=root.attribute("size");// 属性名name2.32 取得/设置为(Set)上面该属性的文字
String text=attribute.getText();2.33 遍历根节点下的所有属性
Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute = (Attribute) it.next(); String text=attribute.getText(); System.out.println(text); }2.34 设置某个节点的属性和文字
element.addAttribute("name", "sitinspring");2.35 为某节点添加和删除属性
// 新建student.xml文件并新增内容 Document document = DocumentHelper.createDocument(); Element root = document.addElement("学生信息"); Element student = root.addElement("学生"); student.addAttribute("sid", "001");
Attribute attribute = <span style="font-family: 微软雅黑, sans-serif;">student</span>.attribute("sid");// 属性名name <span style="font-family: 微软雅黑, sans-serif;">student</span><span style="font-family: 微软雅黑, sans-serif;">.remove(attribute);</span>
2.4 文档最后写入MXL文件
OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK"); // 指定XML编码 XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format); writer.write(document); writer.close();
2.5 字符串与XML的转换
2.51 字符串 To XML
String text = "<members> <member>sitinspring</member> </members>"; Document document = DocumentHelper.parseText(text);2.52 XML To 字符串
SAXReader reader = new SAXReader(); Document document = reader.read(new File("input.xml")); Element root = document.getRootElement(); String docXmlText = document.asXML(); String rootXmlText= root.asXML(); Element memberElm = root.element("member"); String memberXmlText = memberElm.asXML();
2.6 格式化转义字符问题请查看这篇链接文。
3. 最后一个简单的小例子,看看注释和输出结果,很容易理解。就不多解释了。
程序连续运行两次输出结果如下:
import java.io.File; import java.io.FileWriter; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class XML{ public static void main(String[] args) { try { XMLWriter writer = null;// 声明写XML的对象 SAXReader reader = new SAXReader(); OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("GBK");// 设置XML文件的编码格式 String filePath = "d:\student.xml";//文件路径 File file = new File(filePath); if (file.exists()) { Document document = reader.read(file);// 读取XML文件 Element root = document.getRootElement();// 得到根节点 boolean add_new = false; for (Iterator i = root.elementIterator(); i.hasNext();) { Element student = (Element) i.next(); if (student.attributeValue("sid").equals("001")) { //获取并修改学生sid=001的学生信息 Element info_num = student.element("编号"); System.out.println("sid为001的该属性名为 - " + info_num.getName()); System.out.println("sid为001的该属性值为 - " + info_num.getText()); Element info_name = student.element("姓名"); System.out.println("sid为001的该属性名为 - " + info_name.getName()); System.out.println("sid为001的该属性值为 - " + info_name.getText()); info_name.setName("外号"); info_name.setText("余小二"); System.out.println("sid为001的同学新属性名为 - " + info_name.getName()); System.out.println("sid为001的同学新属性值为 - " + info_name.getText()); writer = new XMLWriter(new FileWriter(filePath), format); writer.write(document); writer.close(); add_new = true; break; } } if (add_new) { // 添加一个学生信息 Element student = root.addElement("学生"); student.addAttribute("sid", "100"); Element sid = student.addElement("编号"); sid.setText("100"); Element name = student.addElement("姓名"); name.setText("老大"); Element sex = student.addElement("性别"); sex.setText("男"); Element age = student.addElement("年龄"); age.setText("40"); writer = new XMLWriter(new FileWriter(filePath), format); writer.write(document); writer.close(); } } else { // 新建student.xml文件并新增内容 Document document = DocumentHelper.createDocument(); Element root = document.addElement("学生信息"); Element student = root.addElement("学生"); student.addAttribute("sid", "001"); Element id = student.addElement("编号"); id.setText("001"); Element name = student.addElement("姓名"); name.setText("寂寞"); Element age = student.addElement("年龄"); age.setText("18"); writer = new XMLWriter(new FileWriter(file), format); writer.write(document); writer.close(); } System.out.println("操作结束! "); } catch (Exception e) { e.printStackTrace(); } }