`

关于xml中集合在遍历时一边查找一边删除出现的问题的解决思路的例子

 
阅读更多
package com.lee.dao;

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

import com.lee.domain.Student;
import com.lee.exception.StudentNotExistException;
import com.lee.xmlutils.XmlUtils;

public class StudentDao {
	//	按姓名添加学生
	public void add(Student s){
		Document document ;
		try {
			document = XmlUtils.getDocument();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		//	创建自定义的封装的标签
		Element student_tag = document.createElement("student");
		student_tag.setAttribute("examid", s.getExamid());
		student_tag.setAttribute("idcard", s.getIdcard());
		
		Element name = document.createElement("name");
//		name.setNodeValue(s.getName());
		name.setTextContent(s.getName());
		
		Element location = document.createElement("location");
//		location.setNodeValue(s.getLocation());
		location.setTextContent(s.getLocation());
		
		Element grade = document.createElement("grade");
//		grade.setNodeValue(Double.parseDouble(s.getGrade()));
		grade.setTextContent(String.valueOf(s.getGrade()));
		
		student_tag.appendChild(name);
		student_tag.appendChild(location);
		student_tag.appendChild(grade);
		
		document.getElementsByTagName("exam").item(0).appendChild(student_tag);
		
		try {
			XmlUtils.write2Xml(document);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	//	按身份证号删除学生
	//	从name标签中查找遍历,是否存在于与传过来的参数一致的值
	//	找到后,因为idcard是student的子节点,student是exam的子节点,需要删除的是student
	//	因此,拿到idcard的父节点的父节点exam,删除子节点student
	public void delete(String idcard) throws StudentNotExistException{
		Document document ;
		boolean isDelete = false;
		try {
			document = XmlUtils.getDocument();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException();
		}
		//	nodeList是得到所有的name标签的集合
		//	nodeList.item是从name标签的集合中取出第几个
		//	nodeList.item.getTextContent拿到此节点的文本内容<name>文本内容</name>
		//	如何同时删除多个数据?????如果删除后,找不到idcard了呢,此时出错??????
		//	删除的方法出错了
		
		//	找到错误的原因:
		//	nodeList原集合中有5个元素,a,b,c,d,e
		//	遍历nodeList.item(i)得到student_tag
		//	1.1	当nodeList.item(0)时,删除5个元素中的第1个元素a,剩余b,c,d,e
		//	1.2	当nodeList.item(1)时,删除4个元素中的第2个元素c,剩余b,d,e
		//	由上可以发现,遍历的时候,应该需要减去被删除的个数
		//	即修改的正确方式为:
		//	nodeList.item(i - j)得到student_tag
		//	1.1	当nodeList.item(0 - 0)时,删除5个元素中的第1个元素a,剩余b,c,d,e
		//	因为删除掉一个元素,所以j++
		//	1.2	当nodeList.item(1 - 1)时,删除4个元素中的第1个元素b,剩余c,d,e
		//	于是不会出现空指针,修正了上述的错误
		NodeList nodeList = document.getElementsByTagName("student");
		for(int i = 0, len = nodeList.getLength(), j = 0; i < len; i++){
			System.out.println("Length(): " + nodeList.getLength());
			System.out.println("i: " + i);
			System.out.println("i - j: " + (i - j));
			Element student_tag = (Element) nodeList.item(i - j);	
			System.out.println(student_tag.getAttribute("idcard"));
			if(student_tag.getAttribute("idcard").equals(idcard)){
				student_tag.getParentNode().removeChild(nodeList.item(i - j));
				isDelete = true;
				j++;
			}
		}
		if(isDelete){
			try {
				XmlUtils.write2Xml(document);
				return;
			}catch (StudentNotExistException e) {
				// TODO Auto-generated catch block
				throw e;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				
			}
		}

//		
//		if(isDelete){
//			try {
//				XmlUtils.write2Xml(document);
//			} catch (Exception e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//				throw new RuntimeException(e);
//			}
//		}else{
//			try {
//				throw new StudentNotExistException(idcard + "不存在");
//			} catch (StudentNotExistException e) {
//				// TODO Auto-generated catch block
//				throw e;
//			}
//		}
		
	}
	
	public void delete2(String idcard) throws StudentNotExistException{
		Document document ;
		boolean isDelete = false;
		try {
			document = XmlUtils.getDocument();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException();
		}
		//	nodeList是得到所有的name标签的集合
		//	nodeList.item是从name标签的集合中取出第几个
		//	nodeList.item.getTextContent拿到此节点的文本内容<name>文本内容</name>
		NodeList nodeList = document.getElementsByTagName("name");
		for(int i = 0, len = nodeList.getLength(); i < len; i++){
			if(nodeList.item(i).getTextContent().equals(idcard)){
				nodeList.item(i).getParentNode().getParentNode().removeChild(nodeList.item(i).getParentNode());
				isDelete = true;
			}
		}
		
		if(isDelete){
			try {
				XmlUtils.write2Xml(document);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}else{
			try {
				throw new StudentNotExistException(idcard + "不存在");
			} catch (StudentNotExistException e) {
				// TODO Auto-generated catch block
				throw e;
			}
		}
		
	}
	
	//	按考试编号查询学生
	public Student find(String examid){
		Document document ;
		try {
			document = XmlUtils.getDocument();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
		//	nodeList.itemt().getAttributes(),无法获得指定的属性
		//	所以要用element.item().getAttributes("指定属性")
		//	记忆练习:从节点中拿到指定的子节点,的文本内容
		//	记忆练习:从节点中拿到指定的属性值
		NodeList nodeList = document.getElementsByTagName("student");
		for(int i = 0, len = nodeList.getLength(); i < len; i++){
			Element student_tag = (Element) nodeList.item(i);		
			if(student_tag.getAttribute("examid").equals(examid)){
				Student s = new Student();
				s.setExamid(examid);
				s.setGrade(Double.parseDouble(student_tag.getElementsByTagName("grade").item(0).getTextContent()));
				s.setIdcard(student_tag.getAttribute("idcard"));
				s.setLocation(student_tag.getElementsByTagName("location").item(0).getTextContent());
				s.setName(student_tag.getElementsByTagName("name").item(0).getTextContent());
				return s;
			}
			
		}
		return null;
		
	}
	
	public void update(){
		
	}
}



<?xml version="1.0" encoding="UTF-8" standalone="no"?><exam>
	<student examid="121" idcard="121">
    	<name>aa</name>
    	<location>北京</location>
    	<grade>98.0</grade>  
	</student>


<student examid2="111" idcard="333"><name>a</name><location>bj</location><grade>222.0</grade></student>
<student examid2="111" idcard="333"><name>a</name><location>bj</location><grade>222.0</grade></student>
<student examid2="111" idcard="333"><name>a</name><location>bj</location><grade>222.0</grade></student>

<student examid="111" idcard="2"><name>a</name><location>bj</location><grade>222.0</grade></student>
<student examid2="111" idcard="333"><name>a</name><location>bj</location><grade>222.0</grade></student>


</exam>


package com.lee.test;

import org.junit.Test;

import com.lee.dao.StudentDao;
import com.lee.domain.Student;
import com.lee.exception.StudentNotExistException;

public class StudentDaoTest {

	@Test
	public void addTest(){
		StudentDao dao = new StudentDao();
		Student s = new Student();
		
		String examid = "111";
		double grade = 222;
		String idcard  = "333";
		String location = "bj";
		String name = "a";
		
		s.setExamid(examid);
		s.setGrade(grade);
		s.setIdcard(idcard);
		s.setLocation(location);
		s.setName(name);
		dao.add(s);
	}
	
	@Test
	public void deleteTest() throws StudentNotExistException{
		StudentDao dao = new StudentDao();
		String idcard  = "333";

		dao.delete(idcard);
	}
	
	@Test
	public void findTest(){
		StudentDao dao = new StudentDao();
		String examid  = "1";

		Student s = dao.find(examid);
		System.out.println(s.getExamid());
	}
}

分享到:
评论

相关推荐

    jaxb生成XML例子

    在给定的例子中,我们将深入理解如何使用JAXB注解来生成XML。 1. **@XmlType**: 这个注解用于定义类的属性在XML输出中的顺序。在`WriterXml`类中,propOrder 属性指定了"id", "name", "age", "book"这四个属性的...

    xml用书的教程例子全面的例子

    在本教程中,我们将深入探讨XML的基本概念、规范和实际应用,通过一系列全面的例子帮助读者掌握XML的核心知识。 第1章:XML简介 在这一章节,我们首先会了解XML的起源和它在互联网数据交换中的重要性。XML的设计...

    一个纯XML的网站例子

    XML还可以结合XPath(XML Path Language)用于在XML文档中查找信息,XQuery用于更复杂的查询操作,以及XSD(XML Schema Definition)来定义文档的结构和数据类型,确保数据的完整性和一致性。 在“XML网站”的实现...

    XML中dom根据属性检索节点(C#)

    在C#中,DOM接口提供了丰富的类库来处理XML文档,主要涉及到`System.Xml`命名空间中的几个关键类,如`XmlDocument`、`XmlNode`、`XmlElement`和`XmlAttribute`等。要根据属性检索XML中的节点,我们需要掌握以下几个...

    xml解析为java集合对象.pdf

    在这个过程中,使用了dom4j这一第三方库来解析XML文档,并利用Java的集合框架存储解析后的数据。 ### 知识点一:XML基础 XML(eXtensible Markup Language)即可扩展标记语言,是一种用于存储和传输数据的标记语言...

    map/list集合转化成xml字符串 xml字符串转化成map/list集合

    在Java编程中,数据结构与XML(eXtensible Markup Language)之间的转换是常见的操作,尤其是在处理数据交换或存储时。本篇文章将详细介绍如何将Map和List集合转换为XML字符串,以及如何将XML字符串反向转换回Map和...

    c#读取xml文件增加结点删除节点并在listview中显示xml文件内容

    本文将详细介绍如何使用C#来读取XML文件、添加和删除节点,并将XML文件内容显示在ListView控件中。 首先,我们需要引入System.Xml命名空间,它包含了处理XML文档所需的所有类和方法。在C#代码中,可以使用以下语句...

    简单实用的xml文件例子

    程序员用得上的测试例子,简单实用xml例子

    xml数据岛例子

    这个例子可能展示如何在网页中使用XML数据岛来提高数据的动态性和可操作性。 首先,我们需要理解XML的基本结构。XML文档由元素构成,每个元素都有开始标签和结束标签,如 `&lt;element&gt;` 和 `&lt;/element&gt;`。元素可以...

    dtd例子xml

    dtd例子xmldtd

    QXmlWrapper,实现XML文件的创建、删除以及元素节点的增加、删除、修改与查找等。

    本篇将详细探讨如何使用自定义的Qt封装类QXmlWrapper来操作XML文件,包括创建、删除、元素节点的增删改查以及查找功能。 首先,QXmlWrapper类的设计目标是简化XML文件的操作,通过提供友好的接口,开发者可以更加...

    vc解析xml文件添加到TreeCtrl添加删除修改比较例子

    总之,"vc解析xml文件添加到TreeCtrl添加删除修改比较例子"这个项目涵盖了XML解析、图形界面设计、用户交互等多个方面,对于理解和实践VC++中的XML处理和GUI编程具有很好的参考价值。通过学习和研究此项目,开发者...

    QT读取xml例子

    在本例子中,我们将关注如何使用QT来读取XML文件,这是一种常见的数据存储和交换格式,常用于配置文件、数据序列化等领域。 首先,为了在QT中读取XML文件,我们需要引入相关的头文件`QDomDocument`和`QFile`。`...

    C# LinqXML查找指定名称的元素

    在C#编程中,LINQ to XML是一种强大的API,用于处理XML文档。它结合了LINQ(Language Integrated Query)的强大查询功能与XML处理的简洁性。本篇文章将深入探讨如何使用C# LINQ to XML来查找指定名称的元素。 首先...

    vtd-xml+教程+源码+事例+集合

    在“vtd-xml教程+源码+事例+集合”中,我们可以找到关于VTD-XML的各种学习资源,包括: 1. **教程**:由于网上关于VTD-XML的教程相对较少,这些教程将帮助开发者快速理解和掌握VTD-XML的基本用法,包括如何初始化...

    dom4j 解析xml例子

    在这个“dom4j解析xml例子”中,我们将深入探讨DOM4J如何帮助开发者在Java环境中有效地处理XML数据。 首先,我们需要了解XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置...

    MySql性能优化-通过使用XML将多次循环处理变为一次集合处理

    一个公认的实事,即关系型数据库在结构化的集合处理方面表现优秀,而数据库与编程语言之间通常通过各种参数来进行交互,而XML刚好是它们之间的一个桥梁,把编程语中向面对象的数据序列化为XML,传递到数据库,数据库...

    VDT-XML解析xml文件,修改、查找xml文件。

    在本教程中,我们将深入探讨如何利用VDT-XML来处理XML数据。 1. **XML基础知识** - XML结构:XML文档由元素、属性、文本和声明组成。元素是最基本的构建块,通过尖括号包围,如 `&lt;element&gt;`。 - XML命名规则:...

    Dom4j例子,可以解析大部分的XML

    在TestDom4j项目中,可能包含一个简单的Java程序,演示了如何使用Dom4j解析XML文件、查找特定元素、修改元素内容,并将结果写回XML。这个例子对于初学者来说非常有帮助,因为它展示了Dom4j在实际应用中的基本用法。...

    xml操作的类及常用函数的使用例子

    这个压缩包中的内容可能是关于如何在VC++环境下使用特定的XML操作类和函数的实例教程。 首先,让我们讨论XML的基本概念。XML文档由一系列元素构成,每个元素可以有属性、子元素和文本内容。元素通过开始标签和结束...

Global site tag (gtag.js) - Google Analytics