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());
}
}
分享到:
相关推荐
在开始遍历时,我们将起始节点放入队列中,然后不断取出队首节点,访问它,并将其未被访问过的邻居加入队列,直到队列为空,遍历结束。 接下来,我们要解析XML文件,这通常涉及到Java的DOM(文档对象模型)、SAX...
JavaScript中的`childNodes`属性是DOM(Document Object Model)操作中非常关键的一部分,它允许开发者访问和操作HTML或XML文档中的节点集合。这篇博客主要探讨了`childNodes`在实际开发中的应用和理解,以下是对这...
- **Fail-safe(安全失败)**: 使用迭代器遍历时,即使原集合发生改变,也不会抛出异常。通常通过复制集合来实现,例如`Collections.unmodifiableCollection()`。 #### get和post请求的区别 - **GET**方法:用于...
该教程含路径设置,路径名称注意,具体配置步骤,环境搭建说明书。
寻找热泵最佳压力的优化算法 输入Cop和高压值,以找到最大化Cop的最佳高压 Optimization algorithm to find optimal pressure of heat pump Inputs of Cop and high pressure values to find optimal high pressure that maxes out COP
用友大易2024年AI才有道-AI在企业招聘中的应用现状报告51页.pdf
基于ATP软件的10kV并联电容暂态过程仿真分析与研究,ATP驱动下的10kV并联电容暂态过程精细仿真分析,基于ATP的10kV并联电容暂态过程仿真 ,基于ATP的; 10kV并联电容; 暂态过程; 仿真,ATP算法在10kV电容暂态仿真过程的应用研究
勾正科技恒者行远思者常新-2023H1中国家庭智能大屏行业发展白皮书83页.pdf
“中国房产数据库-各省出租房屋面积 (平方米) 2005-2017年”是一份系统记录中国31个省份在13年间出租房屋面积变化的社会经济数据集,覆盖2005年至2017年间的年度数据。该数据库整合了国家统计局及地方统计年鉴的公开信息,包含各省(含港澳台)的出租房屋面积总量、增长率及区域分布特征,数据格式提供Excel和GIS矢量文件,支持空间分析与时间序列对比。 数据显示,2005-2017年间全国出租房屋面积从1.2亿平方米增至2.8亿平方米,年均增长率达6.7%。区域差异显著:东部沿海地区因经济活跃度高,出租房屋面积占比超60%,其中广东省以年均8.2%的增速居首;中西部省份如四川、河南等则呈现阶段性波动,与人口回流及城镇化政策调整密切相关。 该数据为研究房地产市场供需关系、人口流动模式及城市化进程提供了量化依据。例如,出租房屋面积增长率与GDP增速的相关性分析可揭示经济活力对住房租赁市场的影响;结合户籍人口与常住人口数据,可评估流动人口住房保障政策的实施效果。数据还可用于分析住房租赁市场与房价调控政策的互动关系,为完善住房保障体系提供实证支持。
ABB机器人二次开发实战:C#读写数据操作指南,获取与写入点位信息功能详解,ABB机器人二次开发实战:C#读写数据操作指南,获取与写入点位信息应用,ABB机器人二次开发 C#读取和写入数据,可以获取点位信息及写入点位信息。 自己写的ABB机器人类,机器人常规操作功能都有,非常适合进行二次开发。 ,ABB机器人二次开发; C#读取和写入数据; 读取点位信息; 写入点位信息; 机器人常规操作功能。,ABB机器人二次开发:C#读取与写入数据,轻松获取与编辑点位信息
wireshark log for ethercat
深入解析:Fluent仿真技术在气冷涡轮叶片冷却性能数值模拟中的应用与教学视频指南,《气冷涡轮叶片冷却性能数值模拟——Fluent仿真技术与教学视频》,Fluent仿真,气冷涡轮叶片冷却性能数值模拟(含教学视频) ,根据您提供的内容,可以提炼出以下三个核心关键词: Fluent仿真;气冷涡轮叶片;冷却性能数值模拟 用分号分隔的结果为:Fluent仿真;气冷涡轮叶片;冷却性能数值模拟 希望以上结果符合您的要求。,好的,以下是根据您提供的关键信息所提炼的标题: 气冷涡轮叶片Fluent仿真及冷却性能数值模拟教学视频 这个标题直接明了地概括了您所提供的信息,希望符合您的要求。
linux http 服务器 get put 请求
酷云互动2019智能大屏生态发展白皮书精简版47页.pdf
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
更多毕业设计https://cv2022.blog.csdn.net/article/details/124463185
欧姆龙PLC案例分享:新能源锂电行业全无加密程序,公司级框架,NJ Socket功能PC端作为服务器,欧姆龙NJ NXPLC全程序案例:锂电机械人控制,设备状态监控与报警管理,三色灯与气缸控制等功能模块详解,欧姆龙NJ NXPLC 全ST程序案例,全程序无加密,公司级框架,锂电新能源行业FB库文件,NJ Socket功能PC端作为服务器,NJ作为客户端,汇川机械人控制,设备状态机,设备PPM,运行时间,报警时间,OK产量,NG数量,蜂鸣器三色灯控制功能块,气缸报警功能块,气缸真空动作功能块,轴控制功能块,等等 ,核心关键词:欧姆龙NJ NXPLC; 全ST程序案例; 无加密; 公司级框架; 锂电新能源; FB库文件; NJ Socket功能; PC端服务器; NJ客户端; 汇川机械人控制; 设备状态机; 运行时间; 报警时间; OK产量; NG数量; 蜂鸣器三色灯控制; 气缸报警功能块; 气缸真空动作功能块; 轴控制功能块。,欧姆龙PLC程序案例:新能源锂电设备状态监控与控制功能实现
基于Simulink的35kV变电站三相故障仿真研究:深入探讨变压器与线路的故障响应与保护策略,基于Simulink的35kV变电站三相故障仿真研究:变压器与线路的联合仿真分析,基于simulink的35kv变电站三相故障仿真,包含变压器和线路 ,基于Simulink的35kv变电站仿真; 三相故障; 变压器; 线路。,基于Simulink的35kV变电站变压器与线路三相故障仿真研究
三菱FX3U六轴标准程序:轴点动、回零、相对定位与绝对定位的控制,包含扩展的1PG定位模块和多功能气缸驱动的转盘流水线,三菱FX3U六轴标准程序:轴点动、回零、相对定位、绝对定位,搭配气缸与DD马达控制的转盘实现多工位流水作业,三菱FX3U六轴标准程序,程序包含本体3轴控制,扩展3个1PG定位模块,一共六轴。 程序有轴点动控制,回零控制,相对定位,绝对定位。 另有气缸数个,一个大是DD马达控制的转盘,整个是转盘多工位流水作业方式 ,核心关键词:三菱FX3U六轴标准程序; 3轴控制; 1PG定位模块; 轴点动控制; 回零控制; 相对定位; 绝对定位; DD马达控制转盘; 转盘多工位流水作业。,三菱FX3U六轴程序控制:转盘流水作业及三轴+定位模块综合运动控制
《都市供求信息网》是一个基于JavaWeb技术开发的毕业设计项目,旨在为用户提供便捷的信息发布和交流平台。该系统拥有友好的界面与强大的功能,适合各类信息的发布与查询。如果你对JavaWeb开发感兴趣,欢迎下载完整资源,助力你的学习与实践!