XML编程-DOM4J

基本概述

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。

PS:DOM4J功能那么强大的原因之一就是它支持XPath技术,DOM4J也有相应的参考文档,需要的可以自行搜索下载。

为什么会有DOM4J?

之前,博客里阐述的两门技术,DOM和SAX技术,前者的缺点是耗费内存,后者的缺点是只能进行读取操作,而DOM4J既可以提交效率,也可以进行crud操作。

PS:使用DOM4J需要导入相应基本JAR包,如果使用DOM4J的扩展功能,还需要导入扩展JAR包。

DOM4J使用入门

DOM4J获得Document对象的三种方法

1.读取XML文件,获得document对象(常用)

    SAXReader reader = new SAXReader();Document   document = reader.read(new File(“src/input.xml"));

2.解析XML形式的文本,得到document对象

    String text = "<members></members>";Document document = DocumentHelper.parseText(text);

3.主动创建document对象

    Document document = DocumentHelper.createDocument();//创建根节点Element root = document.addElement("members");

PS:注意要导入相应JAR包。

节点对象

1、获取文档的根节点

    Element root = document.getRootElement();

2、取得某个节点的子节点

    Element element=node.element(“书名");

3、取得节点的内容

    String text1=node.getText();String text2=node.getTextTrim();   // 去掉内容前面和后面的空格

4、取得某节点下所有名为“member”的子节点,并进行遍历

    List nodes = rootElm.elements("member");for (Iterator it = nodes.iterator(); it.hasNext();) {Element elm = (Element) it.next();// do something}

5、对某节点下的所有子节点进行遍历

    for(Iterator it=root.elementIterator();it.hasNext();){Element element = (Element) it.next();// do something}

6、在某节点下添加子节点

    Element ageElm = newMemberElm.addElement("age");

7、设置节点文字

    element.setText("29");

8、删除某节点

    //childElm是待删除的节点,parentElm是其父节点parentElm.remove(childElm);

9、添加一个CDATA节点

    Element contentElm = infoElm.addElement("content");contentElm.addCDATA(diary.getContent());

PS:注意不能跨层访问节点。

节点对象属性

1、取得某节点下的某属性

    Element root=document.getRootElement();    //属性名nameAttribute attribute=root.attribute("size");

2、取得属性的文字

     String text=attribute.getText();

3、删除某属性

    Attribute attribute=root.attribute("size");root.remove(attribute);

4、遍历某节点的所有属性

     Element root=document.getRootElement();    for(Iterator it=root.attributeIterator();it.hasNext();){Attribute attribute = (Attribute) it.next();String text=attribute.getText();System.out.println(text);}

5、设置某节点的属性和文字

    newMemberElm.addAttribute("name", "sitinspring");

6、设置属性的文字

    Attribute attribute=root.attribute("name");attribute.setText("sitinspring");

在指定位置插入节点

1.得到插入位置的节点列表(list)

2.调用list.add(index,elemnent),由index决定element的插入位置。

Element元素可以通过DocumentHelper对象得到。示例代码:

    Element aaa = DocumentHelper.createElement("aaa");aaa.setText("aaa");List list = root.element("书").elements();list.add(1, aaa);//更新document

将文档写入XML文件

1、如果文档是全英文

XMLWriter writer = new XMLWriter(new  FileWriter("output.xml"));
writer.write(document);
writer.close();

2、如果文档含有中文

OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/pc/XML8.xml"), outputFormat);
xmlWriter.write(document);
xmlWriter.close();

PS:出现乱码的原因是因为输出字符集不能识别中文,这样可以通过OutputFormat的setEncoding方法设置为”UTF-8”,然后再使用XMLWriter这种形参的(OutputStream out, OutputFormat format) 构造方构造方法,就能解决乱码问题了,至于为什么会用createPrettyPrint方法,是因为这样做输出的格式更符合人的阅读习惯。

综合案例

XML8.xml

<?xml version="1.0" encoding="utf-8"?>
<班级 班次="1班" 编号="C1"><学生 学号="n1" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1"><名字>张三</名字><年龄>20</年龄><介绍>不错</介绍></学生><学生 学号="n2" 性别="女" 授课方式="面授" 朋友="n1 n3" 班级编号="C1"><名字>李四</名字><年龄>18</年龄><介绍>很好</介绍></学生><学生 学号="n3" 性别="男" 授课方式="面授" 朋友="n2" 班级编号="C1"><名字>王五</名字><年龄>22</年龄><介绍>非常好</介绍></学生><学生 性别="男" 班级编号="C1"><名字>小明</名字><年龄>30</年龄><介绍>好</介绍></学生>
</班级>
package com.pc;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
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;
/*** * @author Switch* @function 使用DOM4j解析XML文件* */
public class XML8 {// 使用DOM4j对XML进行CRUD操作public static void main(String[] args) throws Exception {// 1.得到解析器SAXReader saxReader = new SAXReader();// 2.指定解析哪个XML文件Document document = saxReader.read(new File("src/com/pc/XML8.xml"));// list(document.getRootElement());// read(document);// readByXPath(document);// add(document);// delete(document);// updateElement(document);// updateAttribute(document);// addByIndex(document, 3);}// 更新属性(修改所有班级编号为C2)public static void updateAttribute(Document document) throws Exception {// 得到所有学生List<Element> students = document.getRootElement().elements("学生");for (Element e : students) {// 修改班级编号e.addAttribute("班级编号", "C2");}updateToXML(document);}// 更新元素(将所有学生的年龄+3)public static void updateElement(Document document) throws Exception {// 得到所有学生List<Element> students = document.getRootElement().elements("学生");for (Element e : students) {// 取出年龄Element age = e.element("年龄");age.setText(Integer.parseInt(age.getTextTrim()) + 3 + "");}updateToXML(document);}// 删除元素(删除第一个学生)public static void delete(Document document) throws Exception {// 找到元素Element stu = document.getRootElement().element("学生");// 删除stu.getParent().remove(stu);// 更新updateToXML(document);}// 添加元素到指定位置public static void addByIndex(Document document, int index)throws Exception {// 创建一个元素Element newStu = DocumentHelper.createElement("学生");newStu.setText("小花");// 得到所有学生的listList<Element> students = document.getRootElement().elements("学生");// 按索引添加students.add(index, newStu);// 更新updateToXML(document);}// 添加元素(添加一个学生到xml中)public static void add(Document document) throws Exception {// 创建一个学生节点对象Element newStu = DocumentHelper.createElement("学生");// 给元素添加属性newStu.addAttribute("学号", "n4");Element newStuName = DocumentHelper.createElement("名字");Element newStuAge = DocumentHelper.createElement("年龄");Element newStuIntro = DocumentHelper.createElement("介绍");// 把子元素挂载到学生节点下newStu.add(newStuName);newStu.add(newStuAge);newStu.add(newStuIntro);// 将学生挂载在根节点下document.getRootElement().add(newStu);// 更新updateToXML(document);}private static void updateToXML(Document document)throws UnsupportedEncodingException, FileNotFoundException,IOException {// 更新xml文件// 直接输出会出现中文乱码OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("utf-8");XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/com/pc/XML8.xml"), outputFormat);xmlWriter.write(document);xmlWriter.close();}// xpath技术,跨层读取某个元素public static void readByXPath(Document document) throws Exception {// 取出第一个学生Element student = (Element) document.selectSingleNode("/班级/学生[1]");System.out.println("姓名:" + student.elementText("名字") + "\t年龄:"+ student.elementText("年龄") + "\t介绍:"+ student.elementText("介绍") + "\t性别:"+ student.attributeValue("性别"));}// 读取指定的某个元素(读取第一个学生的信息)public static void read(Document document) throws Exception {// 得到根元素Element root = document.getRootElement();// root.elements("学生"); 取出root元素下的所有学生元素// root.element("学生"); 取出root元素下的第一个学生元素// 取出root元素下的第一个学生元素Element student = (Element) root.elements("学生").get(0);System.out.println("姓名:" + student.elementText("名字") + "\t年龄:"+ student.elementText("年龄") + "\t介绍:"+ student.elementText("介绍") + "\t性别:"+ student.attributeValue("性别"));}// 遍历xml文件public static void list(Element element) {System.out.println("元素名称:" + element.getName() + "\t元素内容:"+ element.getTextTrim());Iterator<Element> iterator = element.elementIterator();while (iterator.hasNext()) {Element e = iterator.next();// 递归list(e);}}
}

XML编程-DOM4J相关推荐

  1. 【风马一族_xml】xml编程

    xml编程:利用java程序支增删改查(CRUD)XML中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了很多的解析api sun jaxp (比较弱)既有dom方式也有sa ...

  2. VC操作XML编程实例

    XML编程实例 文章正文 前段时间,由于工作的需要,利用到了XML,所以对其进行了一些简单的研究.在此愿把一些心得写出来,与各位分享,不对的地方还望多多包涵. 1.什么是 XML? 首先,我想各位应该 ...

  3. java dom xml 换行,dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件...

    网友求助:dom4j解析xml文件_用DOM解析XML文件,怎么才能让解析出来的文本不用换行_dom解析xml文件 问题importjava.text.SimpleDateFormat; import ...

  4. xml之dom4j解析

    * 使用dom4j解析xml 实例在java520里面 TextDom4j * dom4j,是一个组织,针对xml解析,提供解析器dom4j * dom4j不是javase的一部分,想要使用第一步需要 ...

  5. LINQ to XML 编程基础

    http://www.cnblogs.com/luckdv/articles/1728088.html?login=1 1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快 ...

  6. ASP XML 编程简介

    XML 编程简介 收藏此页到茶秀网摘 作者: Steven   www.ASPCool.com 时间:2002-3-4 16:21:06  阅读次数:53017      XML 编程简介   1. ...

  7. java之xml编程

    2019独角兽企业重金招聘Python工程师标准>>> java之xml编程  XML是一个文本信息格式的  XML用于共享数据和传输数据  XML可以描述复杂的树状结构  XML有 ...

  8. XML编程经验――LIBXML2库使用指南

    C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML ...

  9. 【XML和Dom4j、正则表达式】

    day14 [XML和Dom4j.正则表达式] 今日内容 XML 定义XML----组成成员 解析XML----Dom4j,XPath 正则表达式 第一章 XML 1.1 XML介绍 1.1 什么是X ...

最新文章

  1. iOS12 UITabbar Item 向上漂移错位的bug
  2. 【设计】H5移动端页面设计心得分享(附案例解析)
  3. google提供的adb工具包_开源化学信息学工具包(Open Access Cheminformatics Toolkits)
  4. 服务注册中心 eureka 搭建
  5. java中的四个跳转语句_Java中的流程控制语句 (基础篇四)
  6. 快速定位NodeJs线上问题 - 之火焰图篇
  7. Windows Server 2008 R2无密码共享设置
  8. jquery通过ajax方法获取json数据不执行success
  9. Struts2第九篇【OGNL、valueStack详解】
  10. 开课吧:Web开发要学习哪些基础知识?
  11. c语言程序设计ppt算法,C语言程序设计算法.ppt
  12. 关于Matlab中括号用法的总结
  13. ccf 节日 java 思路
  14. 机器学习-29-Pointer Network(指针网络)
  15. 学透CSS-当CSS遇到古诗和月亮,月亮动起来!!!
  16. 微信小程序:装B神器P图修改微信流量主小程序源码下载趣味恶搞图制作免服务器域名
  17. python停止线程_python线程之八:线程停止的3种方式,5个实例
  18. ICIP2021:VVC RPR参考结构改进
  19. 深圳迈瑞医疗电子股份有限公司
  20. 多年经验,怎么做一个优秀的售后工程师

热门文章

  1. c语言 连接两个字符串不使用库函数
  2. Mac Nginx 配置 Tomcat 配置 jdk环境变量 Nginx部署服务遇到的坑(3)
  3. C#设计模式之5-单例模式
  4. 性能测试工具Gatling
  5. python md5加密数据
  6. 143_Power BIPower Pivot月度、季度、半年度、全年同维度展示
  7. go interface转int_go语言学习总结(三十三)Go泛型编程
  8. debian下安装python虚拟环境
  9. Python GUI篇——关不掉的小窗口
  10. 很少人知道,但是非常实用的 Python 库