`
lovelace
  • 浏览: 177699 次
  • 性别: 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、JDOM、DOM4J解析XML实例

    ### DOM、JDOM、DOM4J解析XML实例 ...- **DOM4J**:性能介于DOM和JDOM之间,具有良好的性能和丰富的功能,是处理XML文档的优秀选择。 每种方法都有其适用场景,开发者可以根据具体需求选择合适的工具进行开发。

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

    在Java中,有几种不同的API可以用来处理XML文档,包括DOM、SAX、JDOM和DOM4J。下面将详细介绍这四种方式。 **DOM(Document Object Model)** DOM是一种树形结构的API,它将整个XML文档加载到内存中,形成一个可...

    使用dom4j对xml的读写

    **使用DOM4J对XML的读写** DOM4J是一个非常强大的Java库,专门用于处理XML文档。它提供了丰富的API,使得XML的读取、创建、修改和解析变得简单易行。相较于JDOM,DOM4J确实提供了更多的功能,虽然在学习曲线方面...

    JDom 读写XML

    标题“JDom 读写XML”指的是使用JDom库进行XML文档的处理,包括读取和写入操作。JDom是一个Java API,它为XML文档提供了全面且高性能的处理能力,使得开发者能够方便地构建、修改和访问XML数据。 **JDom详解** 1. ...

    JSP实现对XML读写

    【JSP实现对XML读写】是Web开发中的一项重要技能,它结合了JSP(Java Server Pages)和XML(可扩展标记语言)的优势,使开发者能更灵活地处理和存储数据。XML作为一种通用的数据交换格式,具有自描述性和结构化特点...

    jdom读写xml说明

    JDOM是一个针对Java的DOM(Document Object Model)实现,旨在为Java开发者提供一个高效且灵活的方式来处理XML文档。它提供了直接在内存中构建和操作XML文档的方法,使得XML解析和生成变得简单。 ### 2. 安装与导入...

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

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

    dom4j和jdom的jar包

    DOM4J的API设计简洁,易于学习和使用,使得开发人员可以方便地进行XML文档的读写、遍历、修改等操作。 JDOM,另一方面,是专门为Java设计的一个XML DOM实现。JDOM 2.0.5版本是一个高性能、内存效率高的库,它提供了...

    java 操作xml(dom,sax,jdom,dom4j)需要的包

    DOM4J是一个灵活且功能丰富的XML处理库,它结合了DOM、SAX和JDOM的优点,提供了方便的API来读写、操作XML。DOM4J库包括`dom4j-1.7-20060614.jar`。它支持XPath查询,可以方便地进行文档遍历和修改。DOM4J对内存的...

    xml数据前后台解析:jdom与dom4j源码,程序可以跑

    1. **JDOM**:JDOM是Java针对DOM规范实现的一个轻量级库,它提供了更直观、更高效的API来处理XML文档。JDOM允许开发者直接使用Java对象模型来创建、修改和读取XML。例如,使用JDOM创建XML文档的代码可能如下: ```...

    JDOM解析本地XML

    8. **与DOM和SAX比较**:JDOM相比DOM更轻量级,因为它是为Java设计的,因此在性能和易用性上有所提升。相比于SAX的事件驱动解析,JDOM提供了一个完整的文档对象模型,使得操作XML更加直观,但可能在处理大型XML时...

    jdom+dom4j

    为了处理XML文件,Java开发者经常使用库如JDOM和DOM4J,这两个都是Java XML API的实现。本文将深入探讨JDOM和DOM4J,以及它们在解析XML时的应用。 **JDOM** JDOM,全称Java Document Object Model,是一个专为Java...

    xml(jdom-dom4j).rar_DOM4J_dom4j xml java

    DOM4J提供了一种将XML对象模型转换为字符串的方法,可以使用`DocumentWriter`或者`XMLWriter`来实现XML的输出。通过设置适当的格式化选项,可以控制生成的XML是否带缩进、换行等。 3. **XML的修改**: 修改XML...

    dom4j-1.6.1 和 jdom

    为了处理XML文档,Java提供了多种库,其中dom4j和JDOM是两个常用的选择。这两个库都是Java API,允许开发者对XML进行读取、解析、创建和修改操作。 **dom4j-1.6.1** dom4j是一款功能强大且灵活的Java XML库,它提供...

    java实现Xml文件读写

    在实际项目中,为了更方便地操作XML文件,可以使用开源库如JDOM、DOM4J或Java的StaX API。这些库提供了更高级别的API,使得XML操作更为简洁和高效。 本项目中的"ReadAndWriteXml"可能包含了以上所述的读写操作的...

    java xml 4 种 解析xml 方法 sax jdom dom stAX

    使用JDOM,你可以通过XPath表达式方便地查找和操作XML元素。 3. DOM(Document Object Model) DOM是W3C推荐的标准,它将整个XML文档加载到一个树形结构中,允许开发者通过节点操作进行遍历和修改。DOM解析器提供了...

    Jdom、Dom4j 、dom解析xml文件

    在"ParseXml"这个压缩包中,可能包含了示例代码,演示了如何使用JDOM、DOM4J和DOM解析XML文件。通过阅读和理解这些代码,你可以更好地掌握这些库的用法,提升处理XML文件的能力。记得实践是检验理论的最好方式,尝试...

    jdom,jaxb,dom4j,dom,sax,satx解析XML

    使用JDOM,你可以通过DOM API或SAX API来构建XML文档,然后进行读写操作。JDOM的一个优点是它提供了直接的DOM接口,使得XML处理更加直观。 2. JAXB (Java Architecture for XML Binding) JAXB是Java标准,用于将XML...

    XML.rar_XML java_java call_java xml_xml 读写_xml读写 java

    另外,Java标准库中的javax.xml.parsers和org.w3c.dom包也提供了基本的XML读写支持。 在实际开发中,XML常用于配置文件、数据交换、SOAP(Simple Object Access Protocol)服务等场景。例如,Spring框架大量使用XML...

    dom4j-XML解析.zip

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

Global site tag (gtag.js) - Google Analytics