java之jdom处理xml
2011-09-05 13:17
573 查看
JDOM是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。
JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。
在 JDOM 中,XML 元素就是 Element 的实例,XML 属性就是 Attribute 的实例,XML 文档本身就是 Document 的实例。
创建xml文件:
创建的xml文件为:
修改后的xml文件为:
下面是我自己写的一个ToolXml类,实现基本的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"); } } }
相关文章推荐
- Jdom:高效的XML处理Java API
- java处理XML文档-JDOM
- java日志处理组件log4j--log4j.xml配置详解
- 【面向对象语言系列】关于 Java XML处理,你需要知道的事
- 应用JDOM处理数据库到XML转换的JSP实现
- 使用JDOM处理XML数据之PDF篇(一)
- Java 处理 XML 的三种主流技术及介绍
- 应用JDOM处理数据库到XML转换的JSP实现
- Java处理XML的三种主流技术及介绍
- Java解析XML:Jdom解析和SAX解析
- Java&Xml教程(八)使用JDOM将Java对象转换为XML
- Java 处理 XML 的三种主流技术及介绍
- xml之JDOM解析(含乱码处理)
- java之jdom解析xml(二)
- JDOM处理XML快速上手
- xml java应用(DOM、SAX、JDOM、DOM4j)简介比较
- jdom处理的XML Document 和String 之间的相互转化
- Java学习之路——利用JDOM对xml文档进行解析等操作实例
- JAVA jdom解析xml简单用法
- java解析xml(JDOM)