• 用DOM方式解析XML(用JAXP工具)小案例第一天


    以如下格式的exam.xml文件为例

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <exam>
    	<student idcard="111" examid="222">
    		<name>张三</name>
    		<location>沈阳</location>
    		<grade>89</grade>
    	</student>
    	
    	<student idcard="333" examid="444">
    		<name>李四</name>
    		<location>大连</location>
    		<grade>97</grade>
    	</student>
    	
    </exam>

    编程实现如下功能

    添加用户的界面如下:

    删除用户的界面如下:

    查询用户的界面如下:

    用JAXP DOM方式完成:

    把功能分层设计,好处多多,分层图分析如下:

    分层图功能说明:

    增:用户通过界面输入学生数据,程序接收后通过JavaBean的设置方法封装成JavaBean对象,并传给DAO,DAO通过JavaBean的获取方法获取传过来的JavaBean学生信息,经过处理后写入XML;

    查:用户通过界面输入要查询的学生姓名,并传给DAO,DAO通过XML获取符合要求的学生信息,并通过JavaBean的设置方法封装成JavaBean,再传给Main,然后Main通过JavaBean的获取方法取出学生信息。

    删:用户通过界面输入要删除的学生的准考证号,并传给DAO,DAO删除XML中符合要求的学生

    根据分层设计图创建如下包和类:

    1、com.itheima.domain包: Student.java   (JavaBean)

    2、com.itheima.util包:JaxpUtil.java (getDocument()、write2xml()方法,用于获取DOM树对象和把DOM树对象写入XML文件)

    3、com.itheima.dao包:StudentDaoImpl.java (学生DAO实现类,方法:addStudent() ,queryStudent(),deleteStudent(),即增、查、删三个方法)

    4、com.itheima.test包:StudentDaoImplTest.java(用于临时测试StudentDaoImpl.java里面的增、查、删方法)

    5、com.itheima.view包:Main.java(用于编写用户界面,接收用户信息)

    具体代码如下:

    1、com.itheima.domain包: Student.java 

    package com.itheima.domain;
    
    public class Student {
    	private String idcard;
    	private String examid;
    	private String name;
    	private String location;
    	private float grade;
    	public String getIdcard() {
    		return idcard;
    	}
    	public void setIdcard(String idcard) {
    		this.idcard = idcard;
    	}
    	public String getExamid() {
    		return examid;
    	}
    	public void setExamid(String examid) {
    		this.examid = examid;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getLocation() {
    		return location;
    	}
    	public void setLocation(String location) {
    		this.location = location;
    	}
    	public float getGrade() {
    		return grade;
    	}
    	public void setGrade(float grade) {
    		this.grade = grade;
    	}
    	@Override
    	public String toString() {
    		return "Student [idcard=" + idcard + ", examid=" + examid + ", name="
    				+ name + ", location=" + location + ", grade=" + grade + "]";
    	}	
    }


    2、com.itheima.util包:JaxpUtil.java

    package com.itheima.util;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.w3c.dom.Document;
    
    public class JaxpUtil {
    	public static Document getDocument() throws Exception{
    		DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    		Document document = db.parse("src/exam.xml");
    		return document;
    	}
    	public static void write2xml(Document document) throws Exception {
    		Transformer t = TransformerFactory.newInstance().newTransformer();
    		t.transform(new DOMSource(document), new StreamResult("src/exam.xml"));
    	}
    }
    


    3、com.itheima.dao包:StudentDaoImpl.java

    package com.itheima.dao;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import com.itheima.domain.Student;
    import com.itheima.util.JaxpUtil;
    
    public class StudentDaoImpl {
    	public static boolean addStudent(Student student){
    		boolean result = false;
    		try{
    			//1、获取DOM树
    			Document document = JaxpUtil.getDocument();
    			//2、创建学生元素,并添加属性或主体内容
    			Element studentE = document.createElement("student");
    			studentE.setAttribute("idcard", student.getIdcard());
    			studentE.setAttribute("examid", student.getExamid());
    			Element nameE = document.createElement("name");
    			nameE.setTextContent(student.getName());
    			Element locationE = document.createElement("location");
    			locationE.setTextContent(student.getLocation());
    			Element gradeE = document.createElement("grade");
    			gradeE.setTextContent(student.getGrade()+"");
    			//3、把学生元素添加到DOM
    			Node examN = document.getElementsByTagName("exam").item(0);
    			examN.appendChild(studentE);
    			studentE.appendChild(nameE);
    			studentE.appendChild(locationE);
    			studentE.appendChild(gradeE);
    			//4、把DOM树写回XML文档中
    			JaxpUtil.write2xml(document);
    			result = true;
    		}catch(Exception e){
    			throw new RuntimeException(e);
    		}
    		return result;
    	}
    	public static Student queryStudent(String examid){
    		Student student = null;
    		//1、获得DOM树
    		Document document;
    		try {
    			document = JaxpUtil.getDocument();
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    		//2、获得所有student节点,遍历这些节点的examid属性,
    		//以便找到要查找的examid,并获得这个属性的studetn节点		
    		NodeList studentNodeList = document.getElementsByTagName("student"); 
    		Element studentE = null;
    		for(int i=0;i<studentNodeList.getLength();i++){
    			studentE = (Element) studentNodeList.item(i);
    			if(studentE.getAttribute("examid").equals(examid))
    				break;//此时的studentE就是要查找的目标
    		}
    		//3、把打到的studentE的所有属性值/节点的主体内容封装成StudentBean并返回
    		student = new Student();
    		student.setExamid(studentE.getAttribute(examid));
    		student.setIdcard(studentE.getAttribute("idcard"));
    		student.setName(studentE.getElementsByTagName("name").item(0).getTextContent());
    		student.setLocation(studentE.getElementsByTagName("location").item(0).getTextContent());
    		student.setGrade(Float.parseFloat(studentE.getElementsByTagName("grade").item(0).getTextContent()));
    		return student;
    	}
    	public static boolean deleteStudent(String name){
    		boolean result = false;		
    		//1、获得DOM树
    		Document document;
    		try {
    			document = JaxpUtil.getDocument();
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}		
    		//2、获得所有的name列表,并遍历找到需要的name节点并删除name的父节点(student)
    		NodeList nameNodeList = document.getElementsByTagName("name");
    		for(int i=0;i<nameNodeList.getLength();i++){
    			if(nameNodeList.item(i).getTextContent().equals(name)){
    				nameNodeList.item(i).getParentNode().getParentNode().
    					removeChild(nameNodeList.item(i).getParentNode());
    				result = true;
    				break;
    			}
    		}
    		//3、把删除节点后的DOM树写回XML文档
    		try {
    			JaxpUtil.write2xml(document);
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}	
    		return result;
    	}
    }
    


    4、com.itheima.test包:StudentDaoImplTest.java

    package com.itheima.test;
    
    import com.itheima.dao.StudentDaoImpl;
    import com.itheima.domain.Student;
    
    public class StudentDaoImplTest {
    
    	public static void main(String[] args) {
    		/*Student student = new Student();
    		student.setIdcard("3838438");
    		student.setExamid("520");
    		student.setName("阿Q");
    		student.setLocation("地球");
    		student.setGrade(99.5f);
    		StudentDaoImpl.addStudent(student);*//测试添加功能
    		Student student = StudentDaoImpl.queryStudent("444");//测试查询功能		
    		if(!(student == null))
    			System.out.println(student.getName());
    		else
    			System.out.println("没有这个人!");
    		
    		StudentDaoImpl.deleteStudent("阿Q");//测试删除功能
    	}
    }
    


    5、com.itheima.view包:Main.java

    package com.itheima.view;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    import com.itheima.dao.StudentDaoImpl;
    import com.itheima.domain.Student;
    
    public class Main {
    
    	public static void main(String[] args) {
    		System.out.println("a)添加用户:\tb)查询用户:" +
    				"\tc)删除用户:\n请输入操作类型:");
    		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    		try {
    			String line = reader.readLine();
    			if(line.equals("a")){
    				System.out.println("请输入学生姓名:");
    				String name = reader.readLine();
    				System.out.println("请输入学生准考证号:");
    				String examid = reader.readLine();
    				System.out.println("请输入学生身份证号:");
    				String idcard = reader.readLine();
    				System.out.println("请输入学生所在地:");
    				String location = reader.readLine();
    				System.out.println("请输入学生成绩:");
    				String grade = reader.readLine();
    				
    				//添加学生JavaBean对象
    				Student student = new Student();  
    				student.setName(name);
    				student.setExamid(examid);
    				student.setIdcard(idcard);
    				student.setLocation(location);
    				student.setGrade(Float.parseFloat(grade));
    				
    				//将学生JavaBean对象信息添加到XML文件中
    				if(StudentDaoImpl.addStudent(student))
    					System.out.println("恭喜,添加成功!");
    				else
    					System.out.println("对不起,服务器忙!");
    				
    			}else if(line.equals("b")){
    				System.out.println("请输入查询的学生准考证号:");
    				String examid = reader.readLine();
    				Student student = StudentDaoImpl.queryStudent(examid);
    				if(student != null)
    					System.out.println("您查询学生的信息为:\n" + student);
    				else
    					System.out.println("对不起,服务器忙!");
    			}else if(line.endsWith("c")){
    				System.out.println("请输入要删除的学生姓名:");
    				String name = reader.readLine();
    				if(StudentDaoImpl.deleteStudent(name))					
    					System.out.println("已成功删除学生信息!");
    				else
    					System.out.println("您输入的学生不存在!");
    			}else
    				System.out.println("输入错误,请重新输入");
    		} catch (IOException e) {
    			System.out.println("不好意思,服务器忙!");
    		}
    	}
    
    }
    


     

  • 相关阅读:
    Minecraft 1.12.2/1.14.4 Mod开发笔记——搭建环境
    Minecraft 1.12.2 Mod开发笔记
    浅谈莫比乌斯反演
    卡迈克尔数
    一些可能会有用的东西(持续更新)
    emacs配置
    CSPS 2020游记
    浅谈KMP
    Atcoder AGC052
    乌班图操作指令(持续更新)
  • 原文地址:https://www.cnblogs.com/runwind/p/4454730.html
Copyright © 2020-2023  润新知