`

java之xml的dom解析例程

 
阅读更多
package xmldom;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * 对Student对象的CRUD(增、查、改、删)操作.
 * 
 * @author Administrator
 * 
 */
public class StudentDAOXml {
	/**
	 * 得到文档对象
	 * @param doc
	 * @return
	 */
	private Document getDoc() {
		try{
			File f=new File("D:\\workspace\\base\\student.xml");
			if (f.exists()) {
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				DocumentBuilder builder = factory.newDocumentBuilder();
				return builder.parse(f);
			}else{
				Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
				doc.setXmlStandalone(false);
				doc.setXmlVersion("1.0");
				
				//创建根元素
				Element root=doc.createElement("students");
				doc.appendChild(root);
				return doc;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 把DOM对象同步到文件中
	 */
	private void dom2file(Document doc)
			throws TransformerFactoryConfigurationError {
		try {
			// 使用Transformer完成内存中的文档到文件的转换
			TransformerFactory factory = TransformerFactory.newInstance();
			Transformer transfer = factory.newTransformer();
			//源
			Source xmlSource=new DOMSource(doc);
			//目标
			Result outputTarget=new StreamResult(new File("D:\\workspace\\base\\student.xml"));
			//完成源到目标的转换
			transfer.transform(xmlSource, outputTarget);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 保存对象
	 * 
	 * 1,创建studentElement,设置属性
	 * 2,创建nameElement,设置内容
	 * 3,创建sexEl,设置内容
	 * 4,创建ageEl,设置内容
	 * 5,按顺序把el加到studentEl
	 * 6,把studentEl加到根节点里面
	 * 7,同步
	 * 
	 */
	public void save(Student s) {
		Document doc=this.getDoc();
		if(doc!=null){
			Element root=doc.getDocumentElement();
			
			Element stuEl=doc.createElement("student");
			stuEl.setAttribute("id", s.getId());
			
			Element nameEl=doc.createElement("name");
			nameEl.setTextContent(s.getName());
			
			Element sexEl=doc.createElement("sex");
			sexEl.setTextContent(s.getSex());
			
			Element ageEl=doc.createElement("age");
			ageEl.setTextContent(s.getAge().toString());
			
			stuEl.appendChild(nameEl);
			stuEl.appendChild(sexEl);
			stuEl.appendChild(ageEl);
			
			root.appendChild(stuEl);
		}
		this.dom2file(doc);
	}

	/**
	 * 修改对象
	 * 1,遍历得到给定id的studentEl
	 * 2,得到nameEl,并修改里面文本值
	 * 3,得到ageEl,并修改里面的文本值
	 * 
	 * 4,同步
	 */
	public void update(Student s) {
		Document doc=this.getDoc();
		if(doc!=null){
			Element root=doc.getDocumentElement();
			NodeList nl=root.getElementsByTagName("student");
			for(int i=0;i<nl.getLength();i++){
				Element stuEl=(Element)nl.item(i);
				if(s.getId().equals(stuEl.getAttribute("id"))){
					stuEl.getElementsByTagName("name").item(0).setTextContent(s.getName());
					stuEl.getElementsByTagName("sex").item(0).setTextContent(s.getSex());
					stuEl.getElementsByTagName("age").item(0).setTextContent(s.getAge().toString());
					break;
				}
			}
		}
		this.dom2file(doc);
	}

	/**
	 * 删除对象
	 * 1,找到要删除的那个element
	 * 2,删除element
	 * 3,同步到文件里面
	 */
	public void delete(String id) {
		Document doc = this.getDoc();
		if (doc != null) {
			Element root = doc.getDocumentElement();
			NodeList nl = root.getElementsByTagName("student");
			for (int i = 0; i < nl.getLength(); i++) {
				Element stuEl=(Element)nl.item(i);
				if(id.equals(stuEl.getAttribute("id"))){
					//删除这个节点
					stuEl.getParentNode().removeChild(stuEl);
					break;
				}
			}
			dom2file(doc);
		}
	}

	/**
	 * 根据id查询一个对象
	 */
	public Student get(String id) {
		Student s=null;
		Document doc=null;
		doc = getDoc();
		if(doc!=null){
			Element root=doc.getDocumentElement();
			NodeList nl=root.getElementsByTagName("student");
			for(int i=0;i<nl.getLength();i++){
				Element stuEl=(Element)nl.item(i);
				if(id.equals(stuEl.getAttribute("id"))){
					s=new Student();
					s.setId(stuEl.getAttribute("id"));
					s.setName(stuEl.getElementsByTagName("name").item(0).getTextContent());
					s.setSex(stuEl.getElementsByTagName("sex").item(0).getTextContent());
					s.setAge(Integer.parseInt(stuEl.getElementsByTagName("age").item(0).getTextContent()));
					break;
				}
			}
		}
		return s;
	}

	/**
	 * 查询所有的对象
	 * 思路:
	 * 把XML里面的student元素一个一个解析为Student对象实例
	 * 1,得到文档对象
	 ** 		*1,创建工厂
	 ** 		*2, 得到创建器
	 ** 		*3,使用创建器解析XML得到document文档对象
	 * 2,遍历student元素
	 ** 		*1,得到根节点
	 ** 		*2,得到所有的Student元素
	 ** 		*3,把每个student元素转成Student实例
	 ** 			*1,创建一个student实例
	 ** 			*2,得到ID元素设置到student里面
	 ** 			*3,得到name子元素,把那么子元素里面的子节点的内容设置到name属性
	 ** 			*4,得到age子元素,把那么子元素里面的子节点的内容设置到age属性
	 ** 			*5,装到结果集里面
	 * 4,返回结果集
	 */
	public List<Student> list() {
		List<Student> ss=new ArrayList<Student>();
		Document doc=null;
		doc = getDoc();
		if(doc!=null){
			Element root=doc.getDocumentElement();
			//根据元素的名称得到所有符合这个元素名称的元素节点
			NodeList nl=root.getElementsByTagName("student");
			for(int i=0;i<nl.getLength();i++){
				Element stuEl=(Element)nl.item(i);
				Student student=new Student();
				student.setId(stuEl.getAttribute("id"));
//				stuEl.getElementsByTagName("name").item(0).getChildNodes().item(0).getTextContent();
				student.setName(stuEl.getElementsByTagName("name").item(0).getTextContent());
				student.setSex(stuEl.getElementsByTagName("sex").item(0).getTextContent());
				student.setAge(Integer.parseInt(stuEl.getElementsByTagName("age").item(0).getTextContent()));
				ss.add(student);
			}
		}
		return ss;
	}

}


public class Student {
	private String id;
	private String name;
	private String sex;
	private Integer age;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", sex=" + sex
				+ ", age=" + age + "]";
	}

}

分享到:
评论

相关推荐

    vtd-xml源码+例程

    VTD-XML是一种高效、轻量级的XML处理库,由XimpleWare公司开发,它提供了C和Java两种版本。这个压缩包包含了VTD-XML的C++源码和一些例程,对于想要深入理解VTD-XML工作原理或者进行二次开发的开发者来说,是一个非常...

    jdom解析XML的实用例程

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等场景。...在"jdom解析XML的实用例程"这个主题下,你可以深入学习并实践这些知识,提升你的XML处理技能。

    JAVA 网络编程服务器端例程

    JAVA 网络编程服务器端例程,一个测试socket通信的比较好的例程

    java程序设计教程教材例程

    Java程序设计教程教材例程是学习Java编程的重要资源,它由雍俊海教授在第二版的《Java程序设计教程》中提供。这个压缩包包含了教材每一章节中的所有示例代码,旨在帮助读者深入理解Java语言的基本概念、语法结构以及...

    java的一些简单的例程

    这个名为"java的一些简单的例程"的资源,显然是一系列用Java编写的代码示例,主要针对初学者。虽然资料是英文的,但根据描述,即使对于非英语母语的学习者来说,理解这些代码也应该是没有问题的。 在学习Java编程时...

    xml4c 解析器(含例程)

    xml4c 解析器(含例程), C++编写, 在VC6 环境下配置好工程路径,即可编译. 如果路径配置有疑难问题, 可留言 QQ: 414135435

    Labview_Parse_XML_Data-master.rar

    - **XML解析例程**:自定义的LabVIEW函数,可能是为了简化XML处理或增加特定功能。 - **文档**:解释如何使用提供的代码和资源,以及解析XML数据的基本概念。 - **测试用例**:包含不同类型的XML数据样本,用于验证...

    java例程100例

    在“java例程100例”中,我们聚焦于Java编程语言,这是一个对初学者极其宝贵的资源。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、安全性及高效性能而闻名。以下是对每个标签及其相关的Java知识点的详细...

    java设计模式详细解析及例程

    java设计模式详细解析,通过实例介绍23种设计模式,以chm格式提供,方便查阅。

    TinyXML2简单使用例程

    这个"TinyXML2简单使用例程"是为初学者和开发者提供的一种实用教程,旨在展示如何利用TinyXML2进行XML文档的创建、读取和修改。 XML(Extensible Markup Language)是一种标记语言,常用于存储和传输结构化数据。...

    java学习基本例程

    Java学习基本例程是针对初学者设计的一系列源代码示例,旨在帮助新手逐步掌握Java编程语言的基础知识。这些程序通常包含简单的语法结构、数据类型、控制流程、类与对象等核心概念,让学习者通过实践来理解理论。 1....

    XML入门教程,技巧及例程

    1. 解析器:读取XML文档并转换为内存中的数据结构,如DOM或SAX解析器。 2. DTD(Document Type Definition):定义XML文档结构的规则,用于验证文档是否符合规定。 3. XSD(XML Schema Definition):更现代的验证...

    JAVA的基础例程

    "JAVA的基础例程"这个压缩包文件包含了一系列针对初学者和希望巩固基础的开发者设计的Java程序代码和相关文档。这些资源将帮助你理解Java语言的核心概念,提升你的编程技能,并为可能遇到的开卷考试提供参考资料。 ...

    java串口通信例程

    以上就是关于"java串口通信例程"的相关知识点,通过这些代码,你可以学习如何在Java中建立和管理串口连接,以及如何进行数据的发送和接收。对于想要在Java项目中集成串口通信功能的开发者来说,这是一个很好的起点。

    明华读卡器Java例程

    Java例程通常是建立在这些驱动之上,通过调用特定API来实现读卡器的控制。 2. **Java的设备驱动编程**:在Java中,由于JVM的隔离特性,直接操作硬件通常是不被允许的。但是,通过JNI(Java Native Interface)或者...

    Qt读取XML例程.zip

    本教程将通过标题"Qt读取XML例程.zip"中的内容,详细阐述如何使用Qt的DOM和SAX解析器来操作XML文件。 首先,让我们了解DOM(Document Object Model)和SAX(Simple API for XML)这两种XML解析策略。 1. DOM解析:...

    XML支持库入门教程.rar

    - XML解析库通常提供API来处理XML,例如Java的DOM和SAX,Python的ElementTree,C#的System.Xml等。 4. 易语言XML支持库: - 易语言是一款中国本土的编程语言,其XML支持库提供了处理XML的函数和命令。 - 在...

    JAVA基础全部例程

    在Java编程语言的世界里,"JAVA基础全部例程"是一个非常宝贵的资源,尤其对于那些刚刚踏入这个领域的初学者而言。这个压缩包包含了丰富的基础篇代码示例,旨在帮助学习者理解并掌握Java语言的核心概念。下面,我们将...

    java 4款 游戏例程

    基于Java的扫雷、俄罗斯方块、聊天工具、五子棋,游戏例程。

    XML全面例程,即用即查

    解析器负责读取XML文件并将其转换为内存中的对象模型,DOM则是XML文档的树形表示,允许程序以结构化方式访问和修改XML内容。 第十一章至第十三章可能讲解SOAP(Simple Object Access Protocol)和Web服务。SOAP是...

Global site tag (gtag.js) - Google Analytics