java对xml的增删改查(dom4j)

java对xml的增删改查(dom4j)

网络爱好者交流群:699150673

java本身不能对xml进行解析,所以需要第三方jar包(dom4j)下载地址:https://dom4j.github.io/

版本自己挑,我这里使用2.0.3的

先创建个xml文件

<?xml version="1.0" encoding="GBK" ?>
<陈文生>
    <个人导航 url="www.cwsya.com">导航</个人导航>
    <个人博客 url="www.cnblogs.com/cwsya">博客</个人博客>
    <个人笔记 url="biji.cwsya.com">
        <java笔记 url="biji.cwsya.com/java.html">java</java笔记>
    </个人笔记>
    <github url="github.com/cws666">github</github>
    <gitee url="gitee.com/cwsya">码云</gitee>
</陈文生>

读取(解析)

读取整个文档:

System.out.println("----------创建对象----------");
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./lib/cws.xml"));
System.out.println(document.asXML());	//输出解析出的xml代码

获取根节点并输出名称

System.out.println("----------获取根节点----------");
Element root = document.getRootElement();//获取根节点
System.out.println(root.getName());//输出“陈文生”

获取子节点

System.out.println("----------获取子节点----------");
Element zhuye = root.element("个人导航");	//获取子节点
System.out.println(zhuye.getName());		//输出子节点名称

获取父节点

System.out.println("----------获取父节点----------");
Element fu = zhuye.getParent();
System.out.println(fu.getName());

获取节点信息(节点名称,节点属性,节点内容)

System.out.println("----------获取节点属性----------");
System.out.println(zhuye.getName());
System.out.println(zhuye.getText());
System.out.println(zhuye.attributeValue("url"));

遍历子元素(迭代器)

System.out.println("----------迭代器遍历子元素----------");
Element e=null;
for (Iterator iterator=root.elementIterator(); iterator.hasNext();) {
    e= (Element) iterator.next();
    System.out.println(e.getName());
}

遍历所以属性(迭代器)

Attribute attribute;
System.out.println("----------迭代器遍历所有属性----------");
for (Iterator iterator1=zhuye.attributeIterator(); iterator1.hasNext();){
    attribute=(Attribute) iterator1.next();
    System.out.println(attribute.getName()+":"+attribute.getValue());
}

遍历子元素(for循环)

System.out.println("----------for循环遍历子元素----------");
List<Element> listE=root.elements();
for (Element E:listE) {
    System.out.println(E.getName());
}

遍历属性(for循环)

System.out.println("----------for循环遍历所有属性----------");
List<Attribute> list=zhuye.attributes();
for (Attribute element:list){
    System.out.println(element.getName()+":"+element.getValue());
}

回写

这里我单独列出来回写,并且讲一下写入或修改的原理:

​ 创建对象----修改----写入

只要对原数据进行了修改就需要回写操作

先读取文件,读取完之后数据会在内存中,现在做的一切修改与那个文件没有关系,回写就是将修改后内存中的信息写入到文件中,也就是说你修改原数据(修改的是内存中的)后不做回写操作就不会修改(文件)。

OutputFormat Format= OutputFormat.createPrettyPrint();//有格式,展示时使用.
//OutputFormat Format = OutputFormat.createCompactFormat();//无格式,上传时,用这个
XMLWriter write = new XMLWriter(new FileOutputStream(new File("./lib/cws.xml")), Format);
write.write(document);  //这里是修改后的内容,需要解决异常,我直接抛了
write.close();          //关闭流

添加节点

//增加元素(节点)
System.out.println("----------增加节点----------");
root.addElement("ceshi");
//输出全文,莫得一点卵用,就测试的时候用一下
System.out.println(document.asXML());

效果:

<?xml version="1.0" encoding="UTF-8"?>
<陈文生> 
  <个人导航 url="www.cwsya.com">导航</个人导航>  
  <个人博客 url="www.cnblogs.com/cwsya">博客</个人博客>  
  <个人笔记 url="biji.cwsya.com"> 
    <java笔记 url="biji.cwsya.com/java.html">java</java笔记> 
  </个人笔记>  
  <github url="github.com/cws666">github</github>  
  <gitee url="gitee.com/cwsya">码云</gitee>  
  <ceshi/>		//这里只有一半是因为里面没有东西,现在依然可以操作它,加了东西后就会变成两个
</陈文生>

设置节点信息

//先拿到这个节点
Element github = root.element("github");
//添加节点----添加属性
Element repositories = github.addElement("我的仓库").addAttribute("url", "https://github.com/cws666?tab=repositories");
//设置内容
repositories.setText("仓库");

效果:

<?xml version="1.0" encoding="UTF-8"?>
<陈文生> 
  <个人导航 url="www.cwsya.com">导航</个人导航>  
  <个人博客 url="www.cnblogs.com/cwsya">博客</个人博客>  
  <个人笔记 url="biji.cwsya.com"> 
    <java笔记 url="biji.cwsya.com/java.html">java</java笔记> 
  </个人笔记>  
  <github url="github.com/cws666">github
    <我的仓库 url="https://github.com/cws666?tab=repositories">仓库</我的仓库>
  </github>  
  <gitee url="gitee.com/cwsya">码云</gitee>  
  <ceshi/>
</陈文生>

删除子节点(通过父节点)

Element ceshi=root.element("ceshi");
root.remove(ceshi);

删除属性

//获取节点
Element re=root.element("github").element("我的仓库");
re.remove(re.attribute("url"));//这里也可以填编号(从0开始),不建议这样做

更改方法名

root.setName("天龙先生");

更改属性值

属性名无法更改,但是可以删,也可以加

Element daohang = root.element("个人导航");
Attribute url = daohang.attribute("url");
url.setText("https://www.cwsya.com");

更改内容

Element daohang = root.element("个人导航");
daohang.setText("个人导航");

切记:网上所有看到的教程(包括我),都只会讲常用的,想学好得学会看官方文档和源码

posted @ 2021-05-27 11:43  陈文生  阅读(17)  评论(0编辑  收藏  举报