java之jdom处理xml

本文介绍如何使用JDOM库创建、修改XML文件。包括创建XML文档、添加和修改节点、删除节点等常见操作。

JDOM是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。

在 JDOM 中,XML 元素就是 Element 的实例,XML 属性就是 Attribute 的实例,XML 文档本身就是 Document 的实例。

创建xml文件:

	public void createXmlDoc() throws IOException{
		// 创建根节点
		Element root = new Element("Users");
		// 根节点添加到文档中
		Document doc = new Document(root);
		
		//创建子节点
		Element elem = new Element("User");
		//为子节点添加节点
		elem.addContent(new Element("name").setText("Lily"));
		elem.addContent(new Element("sex").setText("femal"));
		elem.addContent(new Element("age").setText("19"));
		//创建属性
		Attribute att = new Attribute("nation","China");
		// 为节点添加属性
		elem.setAttribute(att);
		
		// 给父节点root添加elem子节点
		root.addContent(elem);
		
		// 创建XML文件输出流
		XMLOutputter xmlOutput = new XMLOutputter();
		// 设置所创建的XML文档的格式
		Format format = Format.getPrettyFormat();
		xmlOutput.setFormat(format);
		// 创建文件输出流
		FileWriter writer = new FileWriter("user.xml");
		// 将生成的XML文档写入到根目录"user.xml"文件中
		xmlOutput.output(doc, writer);
		writer.close();
	}
修改xml文件:

public void modifyXmlDoc() throws JDOMException, IOException{
		// 创建用来解析XML文档的SAXBuilder类的builder对象,并使用该对象中的build方法处理XML文件
		SAXBuilder builder = new SAXBuilder();
		Document doc = builder.build(new File("user.xml"));
		
		//得到根节点
		Element root = doc.getRootElement();
		// 获得XML文档根节点元素下的全部子节点元素
		List<Element> elements = root.getChildren();
		//遍历所有子节点
		for (Element elem : elements) {
			if(elem.getChild("name").getText().equals("Lily")){
				//修改name为Lily的子节点,使之改为Lily2
				elem.getChild("name").setText("Lily2");
				//添加
				elem.addContent(new Element("interest").setText("sing"));
				//删除
				elem.removeChild("sex");
			}
		}
		
		// 创建XML文件输出流
		XMLOutputter xmlOutput = new XMLOutputter();
		// 设置所创建的XML文档的格式
		Format format = Format.getPrettyFormat();
		xmlOutput.setFormat(format);
		// 创建文件输出流
		FileWriter writer = new FileWriter("user.xml");
		// 将生成的XML文档写入到根目录"user.xml"文件中
		xmlOutput.output(doc, writer);
		writer.close();
	}


创建的xml文件为:

<?xml version="1.0" encoding="UTF-8"?>
<Users>
  <User nation="China">
    <name>Lily</name>
    <sex>femal</sex>
    <age>19</age>
  </User>
</Users>

修改后的xml文件为:

<?xml version="1.0" encoding="UTF-8"?>
<Users>
  <User nation="China">
    <name>Lily2</name>
    <age>19</age>
    <interest>sing</interest>
  </User>
</Users>


下面是我自己写的一个ToolXml类,实现基本的xml文件的处理功能:

package com.demos.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import com.demos.util.HelpClass;

public class ToolXml {
	/**
	 * 创建只有根节点的xml文件
	 * 
	 * @param rootStr
	 *            根节点名称
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如
	 *            "D:\\TalkTimestamps.xml"(如果存放在根目录下,只要指定xml的文件名即可
	 *            ,即"TalkTimestamps.xml")
	 */
	public static void CreateXmlDoc(String rootStr, String xmlPath) {
		// 创建根节点
		Element root = new Element(rootStr);
		// 根节点添加到文档中
		Document doc = new Document(root);
		// 将xml文件输出
		OutputXmlDoc(doc, xmlPath);
	}

	/**
	 * 将Document写入到指定目录下的xml文件中
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如
	 *            "D:\\TalkTimestamps.xml"(如果存放在根目录下,只要指定xml的文件名即可)
	 */
	public static void OutputXmlDoc(Document doc, String xmlPath) {
		try {
			// 创建XML文件输出流
			XMLOutputter xmlOutput = new XMLOutputter();
			// 设置所创建的XML文档的格式
			Format format = Format.getPrettyFormat();
			xmlOutput.setFormat(format);
			// 创建文件输出流
			FileWriter writer = new FileWriter(xmlPath);
			// 将生成的XML文档写入到"D:\TalkTimestamps.xml"文件中
			xmlOutput.output(doc, writer);
			writer.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 得到xml文件
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如
	 *            "D:\\TalkTimestamps.xml"(如果存放在根目录下,只要指定xml的文件名即可)
	 * @return
	 */
	public static Document getXmlDoc(String xmlPath) {
		// 创建用来解析XML文档的SAXBuilder类的builder对象,并使用该对象中的build方法处理XML文件
		SAXBuilder builder = new SAXBuilder();
		Document doc = null;
		try {
			doc = builder.build(new File(xmlPath));
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return doc;
	}

	public static boolean isExists(String xmlPath) {
		System.out.println("");
		File f = new File(xmlPath);
		return f.exists();
	}

	/**
	 * 增加结点
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如"D:\\TalkTimestamps.xml"(如果存放在根目录下,
	 *            只要指定xml的文件名即可)
	 * @param nodeName
	 *            节点名
	 * @param paramsList
	 *            节点所含的子节点(key,value)
	 */
	public static void addXmlElement(String xmlPath, Element elem) {
		Document doc = getXmlDoc(xmlPath);
		// 得到父节点
		Element root = doc.getRootElement();
		// 给父节点root添加elem子节点
		root.addContent(elem);
		// 输出到xml文件
		OutputXmlDoc(doc, xmlPath);
	}

	/**
	 * 增加结点
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如"D:\\TalkTimestamps.xml"(如果存放在根目录下,
	 *            只要指定xml的文件名即可)
	 * @param nodeName
	 *            结点名称
	 * @param paramsList
	 *            子节点(key,value)
	 * @param attrsList
	 *            属性(key,value)
	 */
	public static void addXmlElement(String xmlPath, String nodeName,
			ArrayList<HashMap<String, String>> paramsList,
			ArrayList<HashMap<String, String>> attrsList) {
		Document doc = getXmlDoc(xmlPath);
		// 得到父节点
		Element root = doc.getRootElement();

		Element elem = CreateXmlElement(nodeName, paramsList, attrsList);

		// 给父节点root添加elem子节点
		root.addContent(elem);
		// 输出到xml文件
		OutputXmlDoc(doc, xmlPath);
	}

	/**
	 * 创建新结点
	 * 
	 * @param nodeName
	 *            结点名称
	 * @param paramsList
	 *            子节点信息
	 * @param attrsList
	 *            属性信息(key,value)
	 * @return
	 */
	public static Element CreateXmlElement(String nodeName,
			ArrayList<HashMap<String, String>> paramsList,
			ArrayList<HashMap<String, String>> attrsList) {
		Element node = new Element(nodeName);
		if (paramsList != null)
			for (HashMap<String, String> param : paramsList) {
				// 为节点添加子节点
				node.addContent(new Element(param.get("key")).setText(param
						.get("value")));
			}
		if (attrsList != null)
			for (HashMap<String, String> attr : attrsList) {
				// 声明节点属性 并赋值
				Attribute att = new Attribute(attr.get("key"), attr.get(attr
						.get("value")));
				// 为节点添加属性
				node.setAttribute(att);
			}
		return node;
	}

	/**
	 * 修改结点内容
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如"D:\\TalkTimestamps.xml"(如果存放在根目录下,
	 *            只要指定xml的文件名即可)
	 * @param keys
	 *            修改Element的关键字,keys.get(i).get("key")为与子节点对应的节点名,keys.get(i).
	 *            get("value")为与子节点对应的节点值
	 * @param changeList
	 *            修改Element的内容,changeList.get(i).get("key")为与子节点对应的节点名,
	 *            changeList.get(i).get("value")为与子节点对应的节点值
	 */
	public static void ModifyXmlElement(String xmlPath,
			ArrayList<HashMap<String, String>> keys,
			ArrayList<HashMap<String, String>> changeList) {
		Document doc = getXmlDoc(xmlPath);
		Element root = doc.getRootElement();
		// 获得XML文档根节点元素下的全部子节点元素
		List<Element> elements = root.getChildren();
		for (Element elem : elements) {
			boolean flag = true;
			for (HashMap<String, String> key : keys) {
				Element keyElement = elem.getChild(key.get("key"));
				if (!keyElement.getText().equals(key.get("value"))) {
					flag = false;
					break;
				}
			}
			if (flag) {
				for (HashMap<String, String> change : changeList) {
					elem.getChild(change.get("key")).setText(
							change.get("value"));
				}
				break;
			}
		}
		OutputXmlDoc(doc, xmlPath);
	}

	/**
	 * 修改结点内容(只修改一项)
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如"D:\\TalkTimestamps.xml"(如果存放在根目录下,
	 *            只要指定xml的文件名即可)
	 * @param key
	 *            存放要更改结点的key, HashMap<String, String>的key为"key"和"value"
	 * @param change
	 *            存放要更改的内容, HashMap<String, String>的key为"key"和"value"
	 */
	public static void ModifyXmlElement(String xmlPath,
			ArrayList<HashMap<String, String>> keys,
			HashMap<String, String> change) {
		Document doc = getXmlDoc(xmlPath);
		Element root = doc.getRootElement();
		// 获得XML文档根节点元素下的全部子节点元素
		List<Element> elements = root.getChildren();
		for (Element elem : elements) {
			boolean flag = true;
			for (HashMap<String, String> key : keys) {
				Element keyElement = elem.getChild(key.get("key"));
				if (keyElement == null) {
					flag = false;
					break;
				}

				if (!keyElement.getText().equals(key.get("value"))) {
					flag = false;
					break;
				}
			}

			if (flag) {
				elem.getChild(change.get("key")).setText(change.get("value"));
			}
		}

		OutputXmlDoc(doc, xmlPath);
	}

	/**
	 * 删除结点
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如"D:\\TalkTimestamps.xml"(如果存放在根目录下,
	 *            只要指定xml的文件名即可)
	 * @param key
	 *            删除Element的关键字,keys.get(i).get("key")为与子节点对应的节点名,keys.get(i).
	 *            get("value")为与子节点对应的节点值
	 */
	public static void DeleteXmlElement(String xmlPath,
			HashMap<String, String> key) {
		Document doc = getXmlDoc(xmlPath);
		Element root = doc.getRootElement();
		List<Element> elements = root.getChildren();
		ArrayList<Element> remove = new ArrayList<Element>();
		for (int i = 0; i < elements.size(); i++) {
			Element elem = elements.get(i);
			// 根据子节点名得到节点的子节点
			Element keyElement = elem.getChild(key.get("key"));
			if (keyElement.getText().equals(key.get("value"))) {
				remove.add(elem);
			}
		}
		
		for(int i = 0; i < remove.size(); i++){
			// 删除节点elem
			root.removeContent(remove.get(i));
		}
		
		OutputXmlDoc(doc, xmlPath);
	}

	/**
	 * 得到指定结点的值
	 * 
	 * @param xmlPath
	 *            将xml存放的位置及xml文件名称,如"D:\\TalkTimestamps.xml"(如果存放在根目录下,
	 *            只要指定xml的文件名即可)
	 * @param keys
	 *            查找Element的关键字,keys.get(i).get("key")为与子节点对应的节点名,keys.get(i).
	 *            get("value")为与子节点对应的节点值
	 * @param paramsList
	 *            指定要返回的内容的节点名
	 * @return ArrayList<String>的值为Element的内容,其顺序对应于paramsList的key值
	 */
	public static ArrayList<String> getElementContent(String xmlPath,
			ArrayList<HashMap<String, String>> keys,
			ArrayList<String> paramsList) {
		Document doc = getXmlDoc(xmlPath);
		Element root = doc.getRootElement();
		List<Element> elements = root.getChildren();
		ArrayList<String> result = new ArrayList<String>();
		for (Element elem : elements) {
			boolean flag = true;
			for (HashMap<String, String> key : keys) {
				Element keyElement = elem.getChild(key.get("key"));
				if (keyElement == null) {
					flag = false;
					break;
				}

				if (!keyElement.getText().equals(key.get("value"))) {
					flag = false;
					break;
				}
			}

			if (flag) {
				for (String param : paramsList) {
					result.add(elem.getChildText(param));
				}
			}
		}
		return result;
	}

	public static void main(String[] args) {
		String xmlPath = "user.xml";
		//创建只有根节点的xml文件
//		ToolXml.CreateXmlDoc("Users", xmlPath);
//		
//		//添加节点
//		ToolXml.testAddElement(xmlPath, "1111", "2222");
//		ToolXml.testAddElement(xmlPath, "1111", "3333");
//		
//		//修改节点内容
//		ToolXml.testModifyElement(xmlPath, "1111", "2222");

		//删除节点
		ToolXml.testDeleteElement(xmlPath, "3333");

		//得到节点信息
//		ToolXml.testGetElement(xmlPath, "22222");
		
	}
	
	/**
	 * 测试删除节点
	 * @param xmlPath
	 * @param userid
	 */
	public static void testDeleteElement(String xmlPath, String userid){
		HashMap<String, String> key = new HashMap<String, String>();
		 key.put("key", "userid");
		 key.put("value", userid);
		 ToolXml.DeleteXmlElement(xmlPath, key);
	}
	
	/**
	 * 测试添加节点
	 * @param xmlPath
	 * @param otheruserid
	 * @param userid
	 */
	public static void testAddElement(String xmlPath, String otheruserid, String userid){
		 ArrayList<HashMap<String, String>> paramsList = new ArrayList<HashMap<String,String>>();
		 HashMap<String, String> param = new HashMap<String, String>();
		 param.put("key", "otheruserid");
		 param.put("value", otheruserid);
		 paramsList.add(param);
		 param = new HashMap<String, String>();
		 param.put("key", "userid");
		 param.put("value", userid);
		 paramsList.add(param);
		 param = new HashMap<String, String>();
		 param.put("key", "timestamp");
		 param.put("value", new Date().toString());
		 paramsList.add(param);
		 addXmlElement(xmlPath, "User", paramsList, null);
	}

	/**
	 * 测试修改节点信息
	 * @param xmlPath
	 * @param otheruserid
	 * @param userid
	 */
	public static void testModifyElement(String xmlPath, String otheruserid, String userid){
		 ArrayList<HashMap<String, String>> keys = new ArrayList<HashMap<String,String>>();
		 HashMap<String, String> param = new HashMap<String, String>();
		 param.put("key", "otheruserid");
		 param.put("value", otheruserid);
		 keys.add(param);
		 param = new HashMap<String, String>();
		 param.put("key", "userid");
		 param.put("value", userid);
		 keys.add(param);
		 
		 ArrayList<HashMap<String, String>> changeList = new ArrayList<HashMap<String,String>>();
		 HashMap<String, String> change = new HashMap<String, String>();
		 change.put("key", "userid");
		 change.put("value", "22222");
		 changeList.add(change);
		 change = new HashMap<String, String>();
		 change.put("key", "otheruserid");
		 change.put("value", "222222");
		 changeList.add(change);
		 change = new HashMap<String, String>();
		 change.put("key", "timestamp");
		 change.put("value", HelpClass.Date2StringAccurate(new Date()));
		 changeList.add(change);
		 
		 ToolXml.ModifyXmlElement(xmlPath, keys, changeList);
	}
	
	/**
	 * 测试得到节点信息
	 * @param xmlPath
	 * @param userid
	 */
	public static void testGetElement(String xmlPath, String userid){
		ArrayList<HashMap<String, String>> keys = new ArrayList<HashMap<String, String>>();
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("key", "userid");
		map.put("value", userid);
		keys.add(map);
		ArrayList<String> paramsList = new ArrayList<String>();
		paramsList.add("userid");
		paramsList.add("otheruserid");
		paramsList.add("timestamp");
		ArrayList<String> result = null;
		if (isExists(xmlPath)) {
			result = ToolXml.getElementContent(xmlPath, keys, paramsList);
			System.out.println("result: "+result.toString());
			if(result.size() != 0)
				for (String s : result) 
					System.out.println(s);
			else 
				System.out.println("getElement returns empty");
		} else {
			System.out.println("xml file is not exists");
		}

		
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值