需要的jar包: dom4j.jar
用java操作xml文件
package nxs;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
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;
/**
* 修改XML文件
*
* @author Yuk
*
*/
public class DealNxsXml {
/**
* 操作XML文件
*/
public static void main(String[] args) {
updateXml();
}
public static void updateXml() {
// XML文件地址
String xmlUrl = "D:/SoftwareDevelop/MyEclipse2013/Workspaces/test1/湖北农信社OA对接.xml";
File f = new File(xmlUrl);
SAXReader reader = new SAXReader();
Document doc = null;
try {
// 读取XML文件
doc = reader.read(f);
} catch (Exception e) {
}
// 获取文档的根节点
Element root = doc.getRootElement();
// 1.先执行删除节点,只保留第一个object子节点
//deletdNode(root);
// 2.修改第一个object子节点属性值,先获取字段名、字段值,获取一次执行一次
/*
* String name = "归档年度"; String value = "一万年";
* listNodes(root,name,value);
*/
// 3.添加节点及元素,可能有多个电子文件,获取一次执行一次、
for (int i = 0; i < 2; i++) {
String wjXh = "1";// 序号
String wjName = "九寨沟地震";// 计算机文件名
String wjUrl = "www.baidu.com";// 文件地址
addNode(root, wjXh, wjName, wjUrl);
}
// 4.将更新后的XML写入原地址
writeDoc(doc, xmlUrl);
}
删除除了第一个object子节点节点以外的其他子节点
/**
* 1..删除除了第一个object子节点节点以外的其他子节点
*
* @param node
* 根节点
* @return true 删除节点成功
*
*/
public static void deletdNode(Element node) {
node = node.element("object");// 得到第一个object标签
List<Element> list = new ArrayList<Element>();
Iterator<Element> it = node.elementIterator();
while (it.hasNext()) {
// 获取某个子节点对象
Element e = it.next();
// System.out.println(e.getName());
if (e.getName().equals("object")) {
// 如果子节点为object,添加进list
list.add(e);
}
}
for (int i = 0; i < list.size(); i++) {
// 删除第一个object节点下的所有子节点object
//node.remove(list.get(i));
list.get(i).detach();
}
}
修改根节点属性,遍历当前节点元素下面的所有(元素的)子节点
/**
* 2.修改根节点属性,遍历当前节点元素下面的所有(元素的)子节点
*
* @param node
* 根节点
*/
public static void listNodes(Element node, String name, String value) {
System.out.println("当前节点的名称:" + node.getName());
// 获取当前节点的所有属性节点
List<Attribute> list = node.attributes();
// 遍历属性节点
for (Attribute attr : list) {
System.out.println(attr.getName() + "---" + attr.getValue());
/*
* if (attr.getName().equals("target")) { List<Attribute> attrList =
* node.selectNodes("@target"); Iterator<Attribute> i =
* attrList.iterator(); while (i.hasNext()) { Attribute attribute =
* i.next(); attribute.setValue("666666"); } }
*/
if (attr.getValue().equals(name)) {
List<Attribute> attrList = node.selectNodes("@value");
Iterator<Attribute> i = attrList.iterator();
while (i.hasNext()) {
Attribute attribute = i.next();
attribute.setValue(value);
}
}
}
if (!(node.getTextTrim().equals(""))) {
System.out.println("文本内容::::" + node.getText());
}
// 当前节点下面子节点迭代器
Iterator<Element> it = node.elementIterator();
// 遍历
while (it.hasNext()) {
// 获取某个子节点对象
Element e = it.next();
// 对子节点进行遍历
listNodes(e, name, value);
}
}
添加节点及元素
/**
* 3.添加节点及元素
*
* @param node
* 节点
*/
public static void addNode(Element node, String xh, String computerName,
String url) {
Element praentElement = null;// 头节点
// 在第一个object节点下新增子节点object
praentElement = node.element("object").addElement("object");
// 添加节点元素元素
praentElement.addAttribute("type", "电子文件");
Element childElement = null;// 子节点
// 在object节点下新增子节点property
childElement = praentElement.addElement("property");
// 添加节点元素
childElement.addAttribute("name", "序号");
childElement.addAttribute("value", xh);
childElement = praentElement.addElement("property");
childElement.addAttribute("name", "计算机文件名");
childElement.addAttribute("value", computerName);
childElement = praentElement.addElement("property");
childElement.addAttribute("name", "电子文件");
childElement.addAttribute("value", url);
}
将修改的XML重新写入
/**
* 4.将修改的XML重新写入
*
* @param doc
* XML内容
*/
public static void writeDoc(Document doc, String url) {
// 输出XML,文档中含有中文,设置编码格式写入的形式
OutputFormat format = OutputFormat.createPrettyPrint();// 创建文件输出的时候,自动缩进的格式
format.setEncoding("GB2312");// 设置编码
XMLWriter writer = null;
try {
writer = new XMLWriter(new FileWriter(url), format);
} catch (IOException e1) {
}
try {
writer.write(doc);
} catch (IOException e) {
}
try {
writer.close();
} catch (IOException e) {
}
}
}
示例文件:湖北农信社OA对接.xml
<?xml version="1.0" encoding="GB2312"?>
<archive target="666666">
<object type="文件">
<property name="登记号" value="喻康"/>
<property name="归档年度" value="一万年"/>
<property name="文号" value=""/>
<property name="题名" value=""/>
<property name="副题名" value=""/>
<property name="文件形成时间" value="20170606 如这种8位数字"/>
<property name="密级" value=""/>
<property name="保管期限" value=""/>
<property name="紧急程度" value=""/>
<property name="主题词" value=""/>
<property name="机构或问题" value="传机构代码"/>
<property name="责任者" value=""/>
<property name="拟稿人" value=""/>
<property name="拟稿部门" value=""/>
<property name="页数" value=""/>
<property name="电子文件数" value="3 一条公文对应的附件数量(整数)"/>
<property name="备注" value="哦啊是的减肥呢分时度假可能放空间的是你就可能"/>
<object type="电子文件">
<property name="序号" value="1"/>
<property name="计算机文件名" value="九寨沟地震"/>
<property name="电子文件" value="www.baidu.com"/>
</object>
<object type="电子文件">
<property name="序号" value="1"/>
<property name="计算机文件名" value="九寨沟地震"/>
<property name="电子文件" value="www.baidu.com"/>
</object>
<object type="电子文件">
<property name="序号" value="1"/>
<property name="计算机文件名" value="九寨沟地震"/>
<property name="电子文件" value="www.baidu.com"/>
</object>
<object type="电子文件">
<property name="序号" value="1"/>
<property name="计算机文件名" value="九寨沟地震"/>
<property name="电子文件" value="www.baidu.com"/>
</object>
</object>
</archive>