jaxp 解析xml 小demo 对xml文件标签实现增删改查crud操作

本文介绍了一个基于 Java 的 XML 解析工具类 JaxpUtil 的实现,该工具类支持基本的 CRUD 操作,并通过 JaxpDao 接口提供具体的功能实现。文中详细展示了如何利用 DOM 进行 XML 文件的读取、插入、删除、更新和查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



<?xml version="1.0" encoding="utf-8" standalone="no"?><school>
	<student address="江苏省宿迁市" grade="八年级八班" name="郭胜">
		<chinese>99</chinese>
		<math>99</math>
		<english>99</english>
	</student>
</school>
package jaxp;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

/**
 * xml解析工具类
 * @author 郭胜
 *
 */
public class JaxpUtil {
	
	/*
	 * W3C组织对DOM是这样定义的:
       
	 * 整个文档是一个文档节点(Document)
	 * 
	 * XML中的每个标签都是元素节点(Element Node)
	 * 
	 * XML中的每个文本都是文本节点(Text Node)
	 * 
	 * XML中的标签属性都是属性节点(Attr Node)
	 * 
	 * XML中的注释被称为注释节点(Comment Node)
	 * 文本总是存储在文本节点中,而不是存储在元素节点中的,在 DOM 处理中一个普遍的错误是,认为元素节点包含文本。
	 * 
	 * 需要注意的是:由于解析器会将XML文档中的所有节点都加载到内存之中,所以可以很方便的完成CRUD操作,但是此方法也过于暴力,当XML文档内容过大时,可能会造成内存溢出的情况
	 * crud是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。
	 */

	public static Document getDocument(String filePath) throws ParserConfigurationException, SAXException, IOException{
		//获取 DocumentBuilderFactory 的新实例。
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		//使用当前配置的参数创建一个新的 DocumentBuilder 实例。
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse( new File(filePath));
		return doc;
	}
	
	/**
	 * 将document写入xml文件中
	 * 郭胜 
	 * @return
	 * @throws TransformerException 
	 */
	public static boolean writeDocumentToXml(Document doc){
		boolean flag = false;
		TransformerFactory tfactory = TransformerFactory.newInstance();
		try {
			Transformer tf =  tfactory.newTransformer();
			tf.transform(new DOMSource(doc), new StreamResult(
			       new File("jaxp/student.xml")));
			flag = true;
		} catch (TransformerException e) {
			e.printStackTrace();
		}
		return flag;
	}
}
package jaxp;

/**
 * xml文件解析
 * @author 郭胜
 *
 */
public interface JaxpDao {

	/**
	 * 插入学生
	 * @param stu
	 * @return true 成功   false 失败
	 */
	public boolean insertStudent(Student stu);
	
	/**
	 * 根据学生姓名删除学生
	 * @param name
	 * @return true 成功 false 失败
	 */
	public boolean delStudent(String name);
	
	/**
	 * 修改学生信息
	 * @param stu
	 * @return true 成功  false 失败
	 */
	public boolean updateStudent(Student stu);
	
	/**
	 * 查询学生
	 * @param stu
	 * @return Student查询成功 null查询失败
	 */
	public Student searchStudent(Student stu);
	
}

package jaxp;



import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class JaxpDaoImpl implements JaxpDao {

	/*
	 * 	<student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
		<chinese>100</chinese>
		<math>100</math>
		<english>100</english>
	</student>(non-Javadoc)
	 * @see jaxp.JaxpDao#insertStudent(jaxp.Student)
	 */
	public boolean insertStudent(Student stu) {
		boolean flag = false;
		try {
			Document doc = JaxpUtil.getDocument("jaxp/student.xml");
			Element stuElement = doc.createElement("student");
			stuElement.setAttribute("name", stu.getName());
			stuElement.setAttribute("address", stu.getAddress());
			stuElement.setAttribute("grade", stu.getGrade());
			Element chiElement = doc.createElement("chinese");
			chiElement.setTextContent(stu.getChinese().toString());
			stuElement.appendChild(chiElement);
			Element mathElement = doc.createElement("math");
			mathElement.setTextContent(stu.getMath().toString());
			stuElement.appendChild(mathElement);
			Element englishElement = doc.createElement("english");
			englishElement.setTextContent(stu.getEnglish().toString());
			stuElement.appendChild(englishElement);
			Element rootElement = (Element)doc.getElementsByTagName("school").item(0);
			rootElement.appendChild(stuElement);
			flag = JaxpUtil.writeDocumentToXml(doc);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

	/*
	 * 	<student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
		<chinese>100</chinese>
		<math>100</math>
		<english>100</english>
	</student>(non-Javadoc)
	 * @see jaxp.JaxpDao#insertStudent(jaxp.Student)
	 */
	public boolean delStudent(String name) {
		boolean flag = false;
		try {
			Document doc = JaxpUtil.getDocument("jaxp/student.xml");
			NodeList list = doc.getElementsByTagName("student");
			Element rootElement = (Element)doc.getElementsByTagName("school").item(0);
			for (int i=0;i<list.getLength();i++) {
				Node node = list.item(i);
				if(node.getNodeType() == Node.ELEMENT_NODE){
					Element element = (Element)node;
					if(element.getAttribute("name").equals(name)){
						rootElement.removeChild(element);
						break;
					}
				}
			}
			flag = JaxpUtil.writeDocumentToXml(doc);
		} catch (ParserConfigurationException | SAXException | IOException e) {
			e.printStackTrace();
		}
		return flag;
	}

	/*
	 * 	<student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
		<chinese>100</chinese>
		<math>100</math>
		<english>100</english>
	</student>(non-Javadoc)
	 * @see jaxp.JaxpDao#insertStudent(jaxp.Student)
	 * 修改一个属性,grade属性,和成绩
	 */
	public boolean updateStudent(Student stu) {
		boolean flag = false;
		try {
			Document doc = JaxpUtil.getDocument("jaxp/student.xml");
			NodeList list = doc.getElementsByTagName("student");
			for(int i= 0;i<list.getLength();i++){
				if(list.item(i).getNodeType() == Node.ELEMENT_NODE){
					Element element = (Element)list.item(i); 
					if(element.getAttribute("name").equals(stu.getName())){
						element.setAttribute("grade", "八年级八班");
						NodeList childList  = element.getChildNodes();
						for(int j=0;j<childList.getLength();j++){
							Node cnode = childList.item(j);
							if(cnode.getNodeType() == Node.ELEMENT_NODE){
								Element cElement = (Element)cnode;
								if(cElement.getTagName().equals("chinese")){
									cElement.setTextContent(stu.getChinese().toString());
								}
								if(cElement.getTagName().equals("math")){
									cElement.setTextContent(stu.getMath().toString());
								}
								if(cElement.getTagName().equals("english")){
									cElement.setTextContent(stu.getEnglish().toString());
								}
							}
						}
						break;
					}
				}
			}
			flag = JaxpUtil.writeDocumentToXml(doc);
		} catch (ParserConfigurationException | SAXException | IOException e) {
			e.printStackTrace();
		}
		
		return flag;
	}

	/*
	 * 	<student name="郭胜" address="江苏省宿迁市" grade="三年级二班" >
		<chinese>100</chinese>
		<math>100</math>
		<english>100</english>
	</student>(non-Javadoc)
	 * @see jaxp.JaxpDao#insertStudent(jaxp.Student)
	 * 根据学生姓名,搜寻学生信息
	 */
	public Student searchStudent(Student stu) {
		try {
			Document doc = JaxpUtil.getDocument("jaxp/student.xml");
			NodeList list = doc.getElementsByTagName("student");
			for(int i=0;i<list.getLength();i++){
				Node node = list.item(i);
				if(node.getNodeType() == Node.ELEMENT_NODE){
					Element stuElement = (Element)node;
					if(stuElement.getAttribute("name").equals(stu.getName())){
						stu.setAddress(stuElement.getAttribute("address"));
						stu.setGrade(stuElement.getAttribute("grade"));
						NodeList cNodeList = stuElement.getChildNodes();
						for(int j=0;j<cNodeList.getLength();j++){
							Node cNode = cNodeList.item(j);
							if(cNode.getNodeType() == Node.ELEMENT_NODE){
								Element cElement = (Element)cNode;
								if(cElement.getTagName().equals("chinese")){
									stu.setChinese(Integer.parseInt(cElement.getTextContent()));
								}
								if(cElement.getTagName().equals("math")){
									stu.setMath(Integer.parseInt(cElement.getTextContent()));
								}
								if(cElement.getTagName().equals("english")){
									stu.setEnglish(Integer.parseInt(cElement.getTextContent()));
								}
							}
						}
						break;
					}
				}
			}
		} catch (ParserConfigurationException | SAXException | IOException e) {
			e.printStackTrace();
		}
		return stu;
	}

}

package jaxp;

/**
 * jaxp测试
 * @author 郭胜
 *
 */
public class MainTest {
	 
	public static void main(String[] args){
		Student stu = new Student();
		stu.setAddress("江苏省南京市");
		stu.setChinese(99);
		stu.setEnglish(99);
		stu.setMath(99);
		stu.setName("郭胜");
		stu.setGrade("六年级六班");
		JaxpDao jd = new JaxpDaoImpl();
		/*boolean flag = jd.insertStudent(stu);
		MainTest.showFlag(flag);*/
		boolean flag;
		/*flag = jd.delStudent("黄圣依");
		MainTest.showFlag(flag);*/
		flag = jd.updateStudent(stu);
		MainTest.showFlag(flag);
		/*stu.setName("郭胜");
		stu = jd.searchStudent(stu);
		stu.toString();*/
	}
	
	public static void showFlag(boolean flag){
		if(flag){
			System.out.println("成功");
		}else{
			System.out.println("失败");
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值