用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("不好意思,服务器忙!");
		}
	}

}


 

原文地址:https://www.cnblogs.com/runwind/p/4454730.html