xml(3)--dom4j实现crud操作

2024-06-14 18:58
文章标签 xml 实现 操作 crud dom4j

本文主要是介绍xml(3)--dom4j实现crud操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.XML解析技术概述

(1)XML解析方式分为两种:dom和sax
    dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种标准方式。
    sax: (Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。
(2)XML解析器(软件/实现类)
    Crimson(SUN)、Xerces(IBM->APACHE) 、Aelfred2(DOM4J开源组织)
(3)XML解析技术API/开发包(在使用时,一定要导入jar包dom4j-1.6.1.jar,然后右键“Butid Path”)
    Jaxp(SUN/dom/sax)、

Jdom、

dom4j 

以上三种,应该说逐渐递增的好用吧,最简单大莫如dom4j。

2.

DOM4j中,获得Document对象的方式有三种:
(1).读取XML文件,获得document对象(解析)            

            SAXReader reader = new SAXReader();   

           Document   document = reader.read(new File("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");

3.将文档写入XML文件

(1)文档中全为英文,不设置编码,直接写入的形式.  

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

       writer.flush(); 

       writer.close();
(2)文档中含有中文,设置编码格式写入的形式.

OutputFormat format = OutputFormat.createCompactFormat();//以紧凑的方式

OutputFormat of = OutputFormat.createPrettyPrint();//有换行的模式

   OutputStream os = new FileOutputStream("src/cn/itcast/xml/dom4j/car.xml");
     XMLWriter xmlWriter = new XMLWriter(os,format);

或者这样:(输出中文字符的要设置编码方式“utf-8”)

XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"),OutputFormat.createPrettyPrint());


     xmlWriter.write(document);
     xmlWriter.close();


4.(1)CRUD的含义:CreateReadUpdateDelete增删查改

  (2)XML解析器有二类,分别是DOM和SAX。
a)DOM一次性将整个XML文件读到内存,形成一个倒状的树形结构
        b)SAX多次将整个XML文件读到内存
        c)Document对象代表XML文件在内存中的映像 
  (3)常用的API如下:
SAXReader saxReader = new SAXReader(); SAXReader是dom4j的核心类
Document document = saxReader.read("*.xml")
Document.getRootElement()
Element.getName()
Element.elements():取得该元素下的所有直接子元素
  Element.elementText():从一个元素导航到另一个元素且取出该元素的文本
Element.element("sex") :从一个元素导航到另一个元素
Element.attributeValue("id"):取得一个元素对应的属性
Element.addElement("sex").setText("男"):添加新元素,同时设置该元素文本的值
OutputFormat format = OutputFormat.createPrettyPrint():使用缩格形式写XML文件
XMLWriter xmlWriter = new XMLWriter(os,format):构造XML写入器
xmlWriter.write(document):将内存中的document对象写入硬盘
firstCarElement.remove(firstCarPriceElement):从直接父元素删除直接子元素

//firstCarPriceElement.getParent().remove(firstCarPriceElement):从直接父元素删除直接子元素


5.代码练习(实现对xml的crud操作,不过在对xml的cud中都蕴含着r,所以并没有单独写r)

xml源文件(student.xml):


<?xml version="1.0" encoding="UTF-8"?>
<Person> 
  <Student num="2014072201" > 
    <name>一叶扁舟</name>  
    <age>22</age>  
    <profession>软件工程</profession>  
  </Student>  
  <Student num="2014072202"> 
    <name>努力</name>  
    <age>21</age>  
    <profession>软件工程</profession>  
    <sex>女</sex> 
  </Student> 
</Person>



测试代码(Demo.java):


package cn.wwh.www.xml.dom4j;


import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.List;


import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;


/**
 *类的作用:采用xml的dom4j解析xml文件,并能够实现(CRUD操作)
 *注意:
 * 1.采用xpp3reader的解析方式
XPP3Reader xpp3Reader = new XPP3Reader();
Document document = xpp3Reader.read(new File(filePath));
不知道为啥不行????
 *
 *
 *@author 一叶扁舟
 *@version 1.0
 *@创建时间: 2014-7-22   上午10:39:47
 */
public class Demo2 {
private final static String filePath = "src/cn/wwh/www/xml/dom4j/student.xml";
// 实现xml属性和元素的增加
@Test
public void create() throws Exception{
// 采用SAXReader的解析方式:
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filePath));
Element root = document.getRootElement();
// 获取Person下的第一元素Student
Element firstElement = (Element) root.elements().get(0);
// 为第一个Student,添加一个属性id,属性值为:"19920101"
firstElement.addAttribute("id", "19920101");
firstElement.addElement("sex").setText("男");



// 输出根节点下的所有东西
List<Element> elements = root.elements();
System.out.println("根节点下有:"+elements.size()+"元素");
for (Element e : elements) {
// 获取student的属性
Attribute  attribute = e.attribute(0);
System.out.println("标签名:"+e.getName());
System.out.println(e.getName()+"属性                  值:"+attribute.getData()+"\n" +
"attribute.getName():"+attribute.getName()+"\n" +
"attribute.getText():"+attribute.getText());
// 获取所有的子标签
List<Element> child =  e.elements();
for (Element element : child) {
System.out.println(element.getName()+":"+

element.getText());
}
}
// 将数据写会到xml文件中
OutputStream os = new FileOutputStream(filePath);
OutputFormat of = OutputFormat.createPrettyPrint();
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
XMLWriter xmlWrite = new XMLWriter(osw, of);
xmlWrite.write(document);
xmlWrite.flush();
xmlWrite.close();
}
// 实现对xml文件的修改
@Test
public void update() throws Exception{
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File(filePath));
Element root = document.getRootElement();
System.out.println(root.getName());
// 获取第一个Student
Element firstStudent  = (Element) root.elements().get(0);
Element sex = firstStudent.element("sex");
// firstStudent.element("sex").setText("女");
System.out.println(sex.getName());
sex.setText("男");

// 将数据写进xml文件中
OutputStream os = new FileOutputStream(filePath);
OutputStreamWriter osw = new OutputStreamWriter(os,"UTF-8");
OutputFormat  of =  OutputFormat.createPrettyPrint();

XMLWriter xmlWriter  = new XMLWriter(osw,of);
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
}

// 实现对xml的删除操作
@Test
public   void delete() throws Exception{
SAXReader reader = new SAXReader();
Document  document = reader.read(new File(filePath));
Element element = document.getRootElement();
Element firstStudent = (Element) element.elements().get(0);
// 获取Student 的属性id
Attribute attribute = firstStudent.attribute("id");
System.out.println(attribute.getName());
firstStudent.remove(attribute);
// firstStudent.remove();
// 删除第一Student下sex的元素:
Element sex = firstStudent.element("sex");
sex.getParent().remove(sex);
// sex.remove(sex);

// 将数据写回文件中
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.flush();
writer.close();
}
}


代码测试效果图(仅仅显示的create的效果图):








这篇关于xml(3)--dom4j实现crud操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061244

相关文章

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py