Java DOM解析XML文件

一、使用DOM解析XML主要使用的对象

        1、    Document  代表整个XML文档
                getElementsByTagName(String name) 通过标签获得节点列表
                getDocumentElement( )  获得根节点

                 createElement() 创建元素

                createAttribute() 创建属性

                createTextNode()  创建文本节点值

                 removeChild() 删除节点

        2、  NodeList 指包含了一个或者多个节点(Node)的列表
                  item(int index) 遍历每一项

        3、 Element    代表XML文档中的标签
               getAttribute(String attributename)   获得属性

               setAttribute(String attributename)   设置属性

        4、Node是DOM 结构中最基本的对象,代表了文档树中的一个抽象节点
                 getChildNodes( ) 获得当前节点的孩子
                getNodeName( )  获得节点的名称
                getNodeValue( )  获得节点的文本值

               getFirstChild() 获得节点的第一个孩子


二、使用DOM解析XML的具体操作(CRUD)

      stu.xml文件

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<students>
	<student id="java1401">
		<name>zal</name>
		<age>22</age>
	</student>
	<student id="java1402">
		<name>吴晟</name>
		<age>22</age>
	</student>
	<student id="java1403">
		<name>沈彦</name>
		<age>21</age>
	</student>
	
	<student id="QQ1334">
		<name>mike</name>
		<age>12</age>
	</student>
	
	
</students>

     1)实体类省略 

     2)业务类

package com.hlx.dom;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
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.TransformerConfigurationException;
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.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class StudentBiz {
	/**
	 * 1.获得文档对象
	 * 
	 * @param name
	 *            xml文件
	 * @return
	 */
	public Document getDocument(String name) {
		// 1.创建解析器工厂对象
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		// 2.由解析器工厂对象创建解析器对象
		try {
			DocumentBuilder db = factory.newDocumentBuilder();

			// 3.由解析器对象对指定XML文件进行解析
			Document document = db.parse(name);

			return document;
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;

	}

	/**
	 * 2.解析文档 XML
	 * 
	 * @param name
	 */
	public void parseXMl(String name) {
		// 1.获得文档对象
		Document document = getDocument(name);

		// 通过student的标签获得具体的孩子
		NodeList list = document.getElementsByTagName("student");
		// 遍历数据
		System.out.println("学号\t\t姓名 \t年龄");
		for (int i = 0; i < list.getLength(); i++) {

			// buffer对象
			StringBuffer buffer = new StringBuffer();

			// 获得元素
			Element element = (Element) list.item(i);

			// 追加数据 --属性
			buffer.append(element.getAttribute("id") + "\t");
			// 追加数据 --元素 getFirstChild()
			buffer.append(document.getElementsByTagName("name").item(i)
					.getFirstChild().getNodeValue()
					+ "\t");
			buffer.append(document.getElementsByTagName("age").item(i)
					.getFirstChild().getNodeValue());

			// 输出信息
			System.out.println(buffer.toString());
		}

	}

	public void add(String name, Student stu) {
		// 1.获得文档对象
		Document document = getDocument(name);

		// 2.创建student,name,age元素
		// <student></student>
		Element studentEle = document.createElement("student");
		// <name></name>
		Element nameEle = document.createElement("name");
		// <age></age>
		Element ageEle = document.createElement("age");

		// 3.创建属性 id
		Attr idAttr = document.createAttribute("id");
		// 给id赋值
		idAttr.setNodeValue(stu.getId());

		// 4.文本值 沈彦
		Text txtName = document.createTextNode(stu.getName());
		// 21
		Text txtAge = document.createTextNode(stu.getAge() + "");

		// 5.将文本值追加到具体的元素上name,age
		nameEle.appendChild(txtName);
		ageEle.appendChild(txtAge);

		// 6.将name,age追加到student
		studentEle.appendChild(nameEle);
		studentEle.appendChild(ageEle);

		// 7.将属性追加到student
		studentEle.setAttributeNode(idAttr);

		// 8.将student追加到根节点下students
		Element root = document.getDocumentElement();
		root.appendChild(studentEle);

		// 9.写入xml文件
		saveToXml(name, document);

		System.out.println("添加成功!");

	}

	/**
	 * 写入XML文件中
	 * 
	 * @param name
	 * @param document
	 */
	public void saveToXml(String name, Document document) {
		// 1.首先创建转化工厂
		TransformerFactory factory = TransformerFactory.newInstance();

		// 2.创建Transformer,它能够将源树转换为结果树
		try {
			Transformer former = factory.newTransformer();

			// 设置输出样式-->不在同一行
			former.setOutputProperty("indent", "yes");

			// 3.文档xml
			DOMSource source = new DOMSource(document);

			// 4.结果 : name=stu.xml
			StreamResult result = new StreamResult(new FileOutputStream(
					new File(name)));

			// 5.保存
			// 执行将XML Source转换为 Result
			former.transform(source, result);

		} catch (TransformerConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (TransformerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 删除XML文件中的某一个数据
	 * 
	 * @param string
	 * @param student
	 */
	public void del(String name, Student student) {
		// 1.获得文档对象
		Document document = getDocument(name);

		// 2.获得student节点
		NodeList list = document.getElementsByTagName("student");

		// 3.遍历
		for (int i = 0; i < list.getLength(); i++) {
			// 获得每一个元素student
			Element element = (Element) list.item(i);

			// 判断 属性
			if (element.getAttribute("id").equals(student.getId())) {

				// 找到就删除
				document.getDocumentElement().removeChild(element);

				// 退出循环
				break;

			}

		}

		// 9.写入xml文件
		saveToXml(name, document);

		System.out.println("删除成功!");

	}

	/**
	 * 修改数据
	 * 
	 * @param string
	 * @param stu1
	 */
	public void update(String name, Student student) {
		// 1.获得文档对象
		Document document = getDocument(name);

		// 2.获得student节点
		NodeList list = document.getElementsByTagName("student");

		// 3.遍历
		for (int i = 0; i < list.getLength(); i++) {
			// 获得每一个元素student
			Element element = (Element) list.item(i);

			// 判断 属性
			if (element.getAttribute("id").equals(student.getId())) {

				// 找到就修改 name,age
				element.getElementsByTagName("name").item(0).getFirstChild().setNodeValue(student.getName());
				element.getElementsByTagName("age").item(0).getFirstChild().setNodeValue(student.getAge()+"");
			
				// 退出循环
				break;

			}

		}

		// 9.写入xml文件
		saveToXml(name, document);

		System.out.println("修改成功!");

	}
}

 

     3)测试类省略

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值