用java操作xml文件

需要的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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值