Java之解析XML文件实现数据的增删改查方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38225558/article/details/82745684

下面是我的Persons.xml文件数据

<?xml version="1.0" encoding="utf-8"?>
<persons>
	<person id="0">
		<name>翠花</name>
		<age>18</age>
		<sex>女</sex>
	</person>
	<person id="1">
		<name>老王</name>
		<age>20</age>
		<sex>男</sex>
	</person>
</persons>

增删改查:

/**
 * 原生API解析XML    JAXP解析XML 
 * XML文件数据的增删改查
 * @author 郑清
 */
public class XMLDataDemo {

	static File file = new File("E:/eclipse-workspace/JavaEE_workspace/Day34XML/src/Persons.xml");// Persons.xml文件绝对路径

	public static void main(String[] args) throws Exception {
		add();// 添加数据
		delete();// 删除数据
		update();// 修改数据
		select();// 查找数据
	}

	public static void add() throws Exception {
		// ①获得解析器DocumentBuilder的工厂实例DocumentBuilderFactory 然后拿到DocumentBuilder对象
		DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		// ②获取一个与磁盘文件关联的非空Document对象
		Document doc = newDocumentBuilder.parse(file);
		// ③通过文档对象获得该文档对象的根节点
		Element root = doc.getDocumentElement();

		// 创建一个新的person节点
		Element person = doc.createElement("person");
		// 创建person的几个子节点
		Element name = doc.createElement("name");
		Element age = doc.createElement("age");
		Element sex = doc.createElement("sex");
		// 给子节点设置值
		name.setTextContent("张三");
		age.setTextContent("18");
		sex.setTextContent("男");
		// 将子节点追加到person
		person.appendChild(name);
		person.appendChild(age);
		person.appendChild(sex);
		// 给person的id设置值
		person.setAttribute("id", "3");
		// 将person追加到根节点
		root.appendChild(person);

		// 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
		/*
		 * static TransformerFactory newInstance():获取 TransformerFactory 的新实例。 abstract
		 * Transformer newTransformer():创建执行从 Source 到 Result 的复制的新 Transformer。
		 * abstract void transform(Source xmlSource, Result outputTarget):将 XML Source
		 * 转换为 Result。
		 */
		// 获取一个转换器对象transformer
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		Source source = new DOMSource(doc);// 获取内存里面的数据(doc ==> document对象)
		Result result = new StreamResult(file);// 获取磁盘上的文件
		transformer.transform(source, result);// 将 XML==>Source 转换为 Result
	}

	public static void delete() throws Exception {
		// ①获得解析器DocumentBuilder的工厂实例DocumentBuilderFactory 然后拿到DocumentBuilder对象
		DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		// ②获取一个与磁盘文件关联的非空Document对象
		Document doc = newDocumentBuilder.parse(file);
		// ③通过文档对象获得该文档对象的根节点
		Element root = doc.getDocumentElement();

		// 查找指定节点
		// 通过根节点获得子节点
		NodeList personList = root.getElementsByTagName("person");
		// 这里获取第2个节点
		Node item = personList.item(1);
		// 移出节点
		root.removeChild(item);

		// 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
		/*
		 * static TransformerFactory newInstance():获取 TransformerFactory 的新实例。 abstract
		 * Transformer newTransformer():创建执行从 Source 到 Result 的复制的新 Transformer。
		 * abstract void transform(Source xmlSource, Result outputTarget):将 XML Source
		 * 转换为 Result。
		 */
		// 获取一个转换器对象transformer
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		Source source = new DOMSource(doc);// 获取内存里面的数据(doc ==> document对象)
		Result result = new StreamResult(file);// 获取磁盘上的文件
		transformer.transform(source, result);// 将 XML==>Source 转换为 Result
	}

	public static void update() throws Exception {
		// ①获得解析器DocumentBuilder的工厂实例DocumentBuilderFactory 然后拿到DocumentBuilder对象
		DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		// ②获取一个与磁盘文件关联的非空Document对象
		Document doc = newDocumentBuilder.parse(file);
		// ③通过文档对象获得该文档对象的根节点
		Element root = doc.getDocumentElement();

		// 查找指定节点
		// 通过根节点获得子节点
		NodeList personList = root.getElementsByTagName("person");
		// 这里获取第1个节点
		Node item = personList.item(0);
		// System.out.println(item.getTextContent());
		Element personElement = (Element) item;
		// 获取personElement下面的子节点
		NodeList nameList = personElement.getElementsByTagName("name");
		// System.out.println(nameList.item(0).getTextContent());
		// 修改
		nameList.item(0).setTextContent("这里是我修改的名字");

		// 注意:XML文件是被加载到内存中 修改也是在内存中 ==》因此需要将内存中的数据同步到磁盘中
		/*
		 * static TransformerFactory newInstance():获取 TransformerFactory 的新实例。 abstract
		 * Transformer newTransformer():创建执行从 Source 到 Result 的复制的新 Transformer。
		 * abstract void transform(Source xmlSource, Result outputTarget):将 XML Source
		 * 转换为 Result。
		 */
		// 获取一个转换器对象transformer
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		Source source = new DOMSource(doc);// 获取内存里面的数据(doc ==> document对象)
		Result result = new StreamResult(file);// 获取磁盘上的文件
		transformer.transform(source, result);// 将 XML==>Source 转换为 Result
	}

	public static void select() throws Exception {
		// ①获得解析器DocumentBuilder的工厂实例DocumentBuilderFactory 然后拿到DocumentBuilder对象
		DocumentBuilder newDocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		// ②获取一个与磁盘文件关联的非空Document对象
		Document doc = newDocumentBuilder.parse(file);
		// ③通过文档对象获得该文档对象的根节点
		Element root = doc.getDocumentElement();

		// 通过根节点获得子节点
		NodeList personList = root.getElementsByTagName("person");
		// System.out.println(personList);

		// 这里获取第1个节点
		Node item = personList.item(0);
		System.out.println(item.getTextContent());// 获取第一个节点的所有子节点值

		Element element = (Element) item;// 这里转换成子类类型 ==》原因:父类没有对应的方法 这里只看类型不看值

		// 这里获取第1个节点下 name节点值
		NodeList nameList = element.getElementsByTagName("name");
		System.out.println(nameList.item(0).getTextContent());
	}

}

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/82745684