`
lovelace
  • 浏览: 176947 次
  • 性别: Icon_minigender_1
  • 来自: 未知的世界
社区版块
存档分类
最新评论

分别用DOM和JDOM实现XML读写

    博客分类:
  • Java
阅读更多
    jdom用来实现xml读写比用传统的dom方便专业多了。以下是dom实现的:
import javax.xml.parsers.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;
import org.xml.sax.SAXException;

import java.io.*;

public class XmlOperate{
	//Document doc;

	
	
	public XmlOperate() {
		System.out.println("XmlOperate init!");
	}

	/**
	 * @param args
	 * @throws ParserConfigurationException
	 * @throws IOException
	 * @throws SAXException
	 */

	public synchronized LocalCrl readinObj_ID(String id)//根据ID对XML文件查询,返回一个LocalCrl对象
			throws ParserConfigurationException, SAXException, IOException {// 根据ID查询
		LocalCrl obj = null;//将obj初始化为null
//		得到DOM解析器的工厂实例
		DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
//      从DOM工厂获得DOM解析器
		DocumentBuilder builder = dbfactory.newDocumentBuilder();
		Document doc = builder.parse(new File("local.xml"));
		Element root = doc.getDocumentElement();//获得XML文档的根节点
		//System.out.println("根节点标记名:" + root.getTagName());
		NodeList list = root.getElementsByTagName("crl");//获得crl节点列表
		for (int i = 0; i < list.getLength(); i++) {//遍历整个列表
			Element element = (Element) list.item(i);
			// System.out.println(element.getAttribute("dbid"));
			if (id.equals(element.getAttribute("dbid"))) {//找到指定ID的节点,最后跳出循环
				obj=new LocalCrl();//实例化
				obj.setDbid(id);
				for (Node node = element.getFirstChild(); node != null; node = node
						.getNextSibling()) {//获得子节点属性值
					if (node.getNodeName().equals("name")) {
						String name=node.getFirstChild().getNodeValue();
						obj.setName(name);
					}
					if (node.getNodeName().equals("version")) {
						String version=node.getFirstChild().getNodeValue();
						obj.setVersion(version);
					}
					if (node.getNodeName().equals("md5")) {
						String md5=node.getFirstChild().getNodeValue();
						obj.setMd5(md5);
					}					
				}				
				break;
			}
		}
		return obj;
	}
	
	public synchronized void addnewObj(LocalCrl newObj){
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {//判断XML是否已经存在该节点
			LocalCrl isexist=readinObj_ID(newObj.getDbid());
			if(isexist!=null){
				System.out.println("要添加的节点已经存在"+System.currentTimeMillis());
				return;
			}
		} catch (ParserConfigurationException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (SAXException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
//		得到DOM解析器的工厂实例
		DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
//      从DOM工厂获得DOM解析器
		DocumentBuilder builder;
		Document doc=null;
		try {
			builder = dbfactory.newDocumentBuilder();
		    try {
				doc = builder.parse(new File("local.xml"));
			} catch (SAXException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			} catch (IOException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
		} catch (ParserConfigurationException e1) {
			// TODO 自动生成 catch 块
			e1.printStackTrace();
		}
		
		Element root =doc.getDocumentElement();	//获得根节点	
		Element crl=doc.createElement("crl");//创建新的crl元素
		crl.setAttribute("dbid", newObj.getDbid());
		Element name=doc.createElement("name");
		name.appendChild(doc.createTextNode(newObj.getName()));
		Element version=doc.createElement("version");
		version.appendChild(doc.createTextNode(newObj.getVersion()));
		Element md5=doc.createElement("md5");
		md5.appendChild(doc.createTextNode(newObj.getMd5()));
		crl.appendChild(name);
		crl.appendChild(version);
		crl.appendChild(md5);
		root.appendChild(crl);
		
//		创建转换工厂,将结果写回到xml中去
		TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans;
		try {
			trans = tf.newTransformer();
			try {
				trans.transform(new DOMSource(doc),new StreamResult(new File("local.xml")));
			} catch (TransformerException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("添加新节点成功"+System.currentTimeMillis());
	}
	
	public synchronized void deleteObj_ID(String id){
		try {//判断XML是否已经存在该节点
			LocalCrl isexist=readinObj_ID(id);
			if(isexist==null){
				System.out.println("要删除的节点不存在!"+System.currentTimeMillis());
				return;
			}
		} catch (ParserConfigurationException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (SAXException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
//		得到DOM解析器的工厂实例
		DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
//      从DOM工厂获得DOM解析器
		DocumentBuilder builder;
		Document doc=null;
		try {
			builder = dbfactory.newDocumentBuilder();
			try {
				doc = builder.parse(new File("local.xml"));
			} catch (SAXException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			} catch (IOException e) {
				// TODO 自动生成 catch 块
				e.printStackTrace();
			}
		} catch (ParserConfigurationException e1) {
			// TODO 自动生成 catch 块
			e1.printStackTrace();
		}
		
		
		Element root=doc.getDocumentElement();
		NodeList nodelist=root.getElementsByTagName("crl");
		for(int i=0;i<nodelist.getLength();i++){
			Element element=(Element)nodelist.item(i);
			if(id.equals(element.getAttribute("dbid"))){
				Node node=nodelist.item(i);
				root.removeChild(node);
//				创建转换工厂,将结果写回到xml中去
				TransformerFactory tf = TransformerFactory.newInstance();
		        Transformer trans;
				try {
					trans = tf.newTransformer();
					try {
						trans.transform(new DOMSource(doc),new StreamResult(new File("local.xml")));
					} catch (TransformerException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				} catch (TransformerConfigurationException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}
		System.out.println("删除节点成功"+System.currentTimeMillis());
	}
	
	public void deleteObj(LocalCrl old){
		deleteObj_ID(old.getDbid());
	}	
	

}

JDom实现:
import java.io.*;
import java.util.ArrayList;
import java.util.List;

import org.jdom.*;
import org.jdom.input.SAXBuilder;

import org.jdom.output.XMLOutputter;



public class XmlOperate {
	Document doc;//

	File Xmlfile;//操作的xml文件

	class dbidNullException extends Exception {//查询的dbid为空时抛出的异常

		private static final long serialVersionUID = 1L;

		public dbidNullException() {

		}

	}

	public XmlOperate(File xmlfile) {
		
		Xmlfile = xmlfile;
		if(!Xmlfile.exists()){//文件不存在时抛出异常
			try {
				throw new FileNotFoundException();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		SAXBuilder sb = new SAXBuilder();
		try {
			doc = sb.build(Xmlfile);
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	

	public synchronized LocalCrl readinObj_ID(String dbid)// 根据ID对XML文件查询,返回一个LocalCrl对象
	{// 根据ID查询
		/*
		 *
		 */
		if (dbid == null) {//dbid为空时抛出异常
			try {
				throw new dbidNullException();
			} catch (dbidNullException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		LocalCrl obj = null;// 将obj初始化为null
		Element root = doc.getRootElement();//获得根节点
		List list = root.getChildren("crl");//获得所有crl元素
		for (int i = 0; i < list.size(); i++) {
			Element element = (Element) list.get(i);
			if (dbid.equals(element.getAttributeValue("dbid"))) {//匹配时获得crl所有属性,并实例化LocalCrl
				obj = new LocalCrl();
				obj.setDbid(dbid);
				Element name = element.getChild("name");
				obj.setName(name.getText());
				Element version = element.getChild("version");
				obj.setVersion(version.getText());
				Element md5 = element.getChild("md5");
				obj.setMd5(md5.getText());
				break;				
			}			
		}
		
		return obj;
	}

	public synchronized void addnewObj(LocalCrl newObj) {//向XML文件添加一个LocalCrl对象
		/*
		 * 
		 */
		// 判断XML是否已经存在该节点

		LocalCrl isexist = readinObj_ID(newObj.getDbid());
		if (isexist != null) {
			System.out.println("要添加的节点已经存在" + System.currentTimeMillis());
			return;
		}
		Element root = doc.getRootElement();//获得根节点
		Element crl = new Element("crl");
		crl.setAttribute(new Attribute("dbid", newObj.getDbid()));
		Element name=new Element("name");
		name.addContent(newObj.getName());
		Element version=new Element("version");
		version.addContent(newObj.getVersion());
		Element md5=new Element("md5");
		md5.addContent(newObj.getMd5());
		crl.addContent(name);//添加子元素
		crl.addContent(version);
		crl.addContent(md5);
		root.addContent(crl);
		XMLOutputter outputter = new XMLOutputter("    ", true);//定义XML格式

		try {
			outputter.output(doc, new FileOutputStream(Xmlfile));

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public synchronized void deleteObj_ID(String dbid) {//根据dbid删除XML中相应元素
		
		Element root = doc.getRootElement();//获得根节点
		List list = root.getChildren("crl");//获得所有crl元素
		for (int i = 0; i < list.size(); i++) {
			Element element = (Element) list.get(i);
			if (dbid.equals(element.getAttributeValue("dbid"))) {//dbid匹配时删除相应元素				
				root.removeContent(element);

				XMLOutputter outputter = new XMLOutputter("    ", true);//定义XML格式
				try {
					outputter.output(doc, new FileOutputStream(Xmlfile));

				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				break;
				// obj.setName(name.getTextTrim());
			}
		}
	}

	public void deleteObj(LocalCrl old) {//根据LocalCrl删除XML中相应元素
		deleteObj_ID(old.getDbid());
	}

	public ArrayList<LocalCrl> getAllElement() {//获得XML中所有元素
		ArrayList<LocalCrl> arraylist = new ArrayList<LocalCrl>();
		Element root = doc.getRootElement();
		List list = root.getChildren("crl");
		for (int i = 0; i < list.size(); i++) {
			Element element = (Element) list.get(i);
			LocalCrl obj = new LocalCrl();
			obj.setDbid(element.getAttributeValue("dbid"));
			obj.setName(element.getChild("name").getText());
			obj.setVersion(element.getChild("version").getText());
			obj.setMd5(element.getChild("md5").getText());
			arraylist.add(obj);			
		}

		return arraylist;
	}
	
	

}


对应的xml文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><local>
	<crl dbid="15">
		<name>kernel</name>
		<version>1.0.0.0</version>
		<md5>516b0591270cedacefad0d8a25a31d46</md5>	
	</crl>
	<crl dbid="17">
		<name>base</name>
		<version>3.0.0.0</version>
		<md5>0ba0c289664c983dde7a4fa3e907737d</md5>
	</crl>
	<crl dbid="22">
		<name>fonts</name>
		<version>1.0.0.0</version>
		<md5>744ab94e13c43d1a2777a4418b690d1e</md5>	
	</crl>
</local>

里面LocalCrl类:
public class LocalCrl {//LocalCrl类
	
	String dbid;
	String name;
	String version;
	String md5;
	public String getDbid() {
		return dbid;
	}
	public void setDbid(String dbid) {
		this.dbid = dbid;
	}
	public String getMd5() {
		return md5;
	}
	public void setMd5(String md5) {
		this.md5 = md5;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getVersion() {
		return version;
	}
	public void setVersion(String version) {
		this.version = version;
	}

}
分享到:
评论

相关推荐

    DOM、SAX、JDOM、DOM4J读写xml文档

    总结DOM、SAX、JDOM、DOM4J读写xml文档的多种方法。

    使用dom4j对xml的读写

    使用dom4j对xml的读写(这个感觉比jdom功能好点,但是复杂一点点)

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。下载地址 .txt

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    dom4j-XML解析.zip

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    xml解析器-dom4j的支持包_ 教程

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

    dom4j将xml文件导入到数据库所需要的包

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的,这里有所需要的包

    dom4j-1.6.1 和 jdom

    压缩包中有dom4j的读写的简单方法,jdom只有写的方法,个人感觉dom4j更好用些

    dom4j-jar包下载

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

    dom4j-1.6.1 xml开发利器

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    dom4j文档和源码及jar包

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

    dom4j-1.5.jar

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

    JavaXml读写操作四种方式汇总

    涵盖了DOM、SAX、JDOM和DOM4J四种方式,读写xml。都给出了具体例子,都是可执行的。

    JDOM的jar包 jdom-b7.jar

    JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。...在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。

    dom4j-1.6.1.jar和jaxen-1.1-beta-7.jar

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

    dom4j-1.6.1-jar文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能...如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。

    dom4j-2.0.0-RC1包含jar包全部源码及文档.rar

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM ...

    dom4j-1.6 JAR包+API文档

    dom4j-1.6 dom4j-1.6 JAR包 dom4j-1.6API文档;...如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包, Hibernate用它来读写配置文件。

    资源jar包dom4j-1.6.1.rar

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的...

    dom4j-1.6.1

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

    dom4j-2.0.0-ALPHA.rar

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。...

Global site tag (gtag.js) - Google Analytics