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。 1. **@XmlType**: 这个注解用于定义类的属性在XML输出中的顺序。在`WriterXml`类中,propOrder 属性指定了"id", "name", "age", "book"这四个属性的...
在处理XML文档时,我们可能会遇到一个问题:当尝试删除某个节点时,该节点虽然被标记为删除,但在实际输出或解析时,它可能仍然存在,表现为一个空节点。这种情况通常是由于XML库或编程语言的特定行为导致的。本文将...
XML还可以结合XPath(XML Path Language)用于在XML文档中查找信息,XQuery用于更复杂的查询操作,以及XSD(XML Schema Definition)来定义文档的结构和数据类型,确保数据的完整性和一致性。 在“XML网站”的实现...
3. **XPath查询**:XPath是XML路径语言,用于在XML文档中查找信息。XMLSpy2009内置的XPath编辑器和测试器,可以帮助用户编写和测试XPath表达式,快速定位和提取所需数据。 4. **SOAP工具**:SOAP(Simple Object ...
在C#中,DOM接口提供了丰富的类库来处理XML文档,主要涉及到`System.Xml`命名空间中的几个关键类,如`XmlDocument`、`XmlNode`、`XmlElement`和`XmlAttribute`等。要根据属性检索XML中的节点,我们需要掌握以下几个...
在这个过程中,使用了dom4j这一第三方库来解析XML文档,并利用Java的集合框架存储解析后的数据。 ### 知识点一:XML基础 XML(eXtensible Markup Language)即可扩展标记语言,是一种用于存储和传输数据的标记语言...
7. **代码示例**:在提供的"pb操作XML的例子-很不错061211-pb9"文件中,可能包含了一些具体的代码示例,演示如何在PB9中加载XML文件,遍历DOM树,修改元素值,以及保存XML到文件等操作。 综上所述,PowerBuilder...
在Java编程中,数据结构与XML(eXtensible Markup Language)之间的转换是常见的操作,尤其是在处理数据交换或存储时。本篇文章将详细介绍如何将Map和List集合转换为XML字符串,以及如何将XML字符串反向转换回Map和...
程序员用得上的测试例子,简单实用xml例子
在IT行业中,jQuery和Asp.net是两种广泛使用的技术,分别在前端和后端发挥着重要作用。本示例代码着重展示了如何结合这两种技术,实现XML文件的动态操作,包括添加、编辑和删除节点。XML(Extensible Markup ...
这个例子可能展示如何在网页中使用XML数据岛来提高数据的动态性和可操作性。 首先,我们需要理解XML的基本结构。XML文档由元素构成,每个元素都有开始标签和结束标签,如 `<element>` 和 `</element>`。元素可以...
dtd例子xmldtd
本篇将详细探讨如何使用自定义的Qt封装类QXmlWrapper来操作XML文件,包括创建、删除、元素节点的增删改查以及查找功能。 首先,QXmlWrapper类的设计目标是简化XML文件的操作,通过提供友好的接口,开发者可以更加...
C#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XMLC#例子代码 A0200_XML...
总之,"vc解析xml文件添加到TreeCtrl添加删除修改比较例子"这个项目涵盖了XML解析、图形界面设计、用户交互等多个方面,对于理解和实践VC++中的XML处理和GUI编程具有很好的参考价值。通过学习和研究此项目,开发者...
标题“Treeview+xml怎删改的例子”暗示我们将探讨如何在TreeView控件中动态地添加、修改和删除XML数据。以下是一些关键知识点: 1. **TreeView控件**:这是Windows Forms或WPF等GUI框架中的一个组件,可以显示具有...
在本例子中,我们将关注如何使用QT来读取XML文件,这是一种常见的数据存储和交换格式,常用于配置文件、数据序列化等领域。 首先,为了在QT中读取XML文件,我们需要引入相关的头文件`QDomDocument`和`QFile`。`...
2. **XPath**:XPath是用于在XML文档中查找信息的语言。通过XPath,你可以定位到XML文档中的特定元素、属性或者文本。在Java中,可以使用`javax.xml.xpath`包中的`XPathFactory`和`XPath`类来执行XPath表达式。 3. ...
在“vtd-xml教程+源码+事例+集合”中,我们可以找到关于VTD-XML的各种学习资源,包括: 1. **教程**:由于网上关于VTD-XML的教程相对较少,这些教程将帮助开发者快速理解和掌握VTD-XML的基本用法,包括如何初始化...
在这个“dom4j解析xml例子”中,我们将深入探讨DOM4J如何帮助开发者在Java环境中有效地处理XML数据。 首先,我们需要了解XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置...