这篇我就简单明了的分享一下,对xml文件的各个节点及属性进行增、删、改的操作并写入新的或者保存到xml文件中,下边的代码很详细,注释很明了,大家一看即可了解。
测试的xml文件test2.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <root>
- <user editor="chenleixing" date="2015-02-15">
- <name>张三</name>
- </user>
- </root>
创建File对象获取Document和根节点
- /**
- * 获取文件的document对象,然后获取对应的根节点
- * @author chenleixing
- */
- @Test
- public void testGetRoot() throws Exception{
- SAXReader sax=new SAXReader();//创建一个SAXReader对象
- File xmlFile=new File("d:\\test2.xml");//根据指定的路径创建file对象
- Document document=sax.read(xmlFile);//获取document对象,如果文档无节点,则会抛出Exception提前结束
- Element root=document.getRootElement();//获取根节点
- //this.getNodes(root);//从根节点开始遍历所有节点
- this.editAttribute(root,"user");//对指定名字的节点进行属性的添加删除修改
- this.addNode(root,"newNode","新增节点的内容");//对指定的节点新增名为newNode的子节点,并指定新增字节的内容
- this.saveDocument(document, xmlFile);//把改变的内存中的document真正保存到指定的文件中
- }
注意这三个方法:
- this.editAttribute(root,"user");//对指定名字的节点进行属性的添加删除修改
- this.addNode(root,"newNode","新增节点的内容");//对指定的节点新增名为newNode的子节点,并指定新增字节的内容
- this.saveDocument(document, xmlFile);//把改变的内存中的document真正保存到指定的文件中
下边会依依介绍和展现。
对指定节点进行属性的添加删除和修改
此处传入根节点和名为user的节点如最开始的调用this.editAttribute(root,"user"):
- /**
- * 对指定的节点属性进行删除、添加、修改
- * @author chenleixing
- */
- public void editAttribute(Element root,String nodeName){
- //获取指定名字的节点,无此节点的会报NullPointerException,时间问题不做此情况的判断与处理了
- Element node=root.element("user");
- Attribute attr=node.attribute("editor");//获取此节点指定的属性,无此节点的会报NullPointerException
- node.remove(attr);//删除此属性
- Attribute attrDate=node.attribute("date");//获取此节点的指定属性
- attrDate.setValue("更改");//更改此属性值
- node.addAttribute("add","增加");//添加的属性
- }
对指定节点添加子节点和对应的文本内容
此方法传入根节点,名为newNode的新增节点和对应的新增内容,如开头代码this.addNode(root,"newNode","新增节点的内容"):
- /**
- * 对指定的节点添加子节点和对象的文本内容
- * @author chenleixing
- */
- public void addNode(Element node,String nodeName,String content){
- Element newNode=node.addElement(nodeName);//对指定的节点node新增子节点,名为nodeName
- newNode.setText(content);//对新增的节点添加文本内容content
- }
保存改变的Document到新文件或源文件
以上对节点的添加、属性的修改都是还停留在内存当中,还未真正保存到文件里即原文件里的内容至此还未发生变化,等把内存的document的内容写入到对应文件里才可以,如下边代码所示:
- /**
- * 把改变的domcument对象保存到指定的xml文件中
- * @author chenleixing
- * @throws IOException
- */
- public void saveDocument(Document document,File xmlFile) throws IOException{
- Writer osWrite=new OutputStreamWriter(new FileOutputStream(xmlFile));//创建输出流
- OutputFormat format = OutputFormat.createPrettyPrint(); //获取输出的指定格式
- format.setEncoding("UTF-8");//设置编码 ,确保解析的xml为UTF-8格式
- XMLWriter writer = new XMLWriter(osWrite,format);//XMLWriter 指定输出文件以及格式
- writer.write(document);//把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
- writer.flush();
- writer.close();
过程中一定注意编码的问题,如代码里所注释的,否则汉字很容易出现乱码。
查看更改后的结果文件
- <?xml version="1.0" encoding="UTF-8"?>
- <root>
- <user date="更改" add="增加">
- <name>张三</name>
- </user>
- <newNode>新增节点的内容</newNode>
- </root>