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("个人导航");
切记:网上所有看到的教程(包括我),都只会讲常用的,想学好得学会看官方文档和源码