XML解析之Dom

关于xml解析的几个方法总是喜欢忘记,因此记录下来方便日后查看。

常用解析方法为DOM,SAX,DOM4J,PULL

其中DOM4J为JDOM升级版。


1.XML解析概述

    DOM, SAX:都属于JAXP包 JAXP   开发包是 J2SE 的一部分,它由   javax.xml org.w3c.dom   org.xml.sax 包及其子包组成。


2.DOM概述:

相关概念

DOM解析是把所有的xml加载到内存中,以树的形式存储,所以使用DOM解析是要牢记一下几点:

a.明确Node概念,明确子节点,父节点等概念,Document是代表整个xml,对应到树中就是root,其子节点就是xml的根标签,所以Document是整个xml文件的入口

b.所有的对象都是Node的子类,如:Element,Attr,Document都是Node的子类

c,Node是树的概念,Element,attr,Document等属性是xml的概念,不要混淆,但是DOM解析是基于树的特点来的,所以对于xml的操作都是基于Node做的


DOM关系图解


DOM常用方法



3.接下来介绍通过DOM对xml文件CRUD.

要解析的xml文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="001">
        <name>张三</name>
        <password>abc</password>
    </user>
    <user id="002">
        <name>李四</name>
        <password>2</password>
    </user>
    <user id="003">
        <name>王五</name>
        <password>3</password>
    </user>
    <user id="004">
        <name>王麻子</name>
        <password>5</password>
    </user>

	<user id="005">
		<name>Dean</name>
		<password>5</password>
	</user>
</users>

JUnit代码如下:

package neuq.test.dom;

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.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

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


 /*	
  *测试Dom解析xml的CRUD方法:
  *
  *读: 查看所有的数据 有条件的查询数据
  *写入:姓名:Dean,id:005,密码:5
  *更新:将用户张三的密码更新为abc
  *删除:删除所有的user标签,有条件的删除:id=002删除对应的user标签
  *
  *@author:Dean
  *@date:2014-6-23
  *
  */

 


public class DOMTest {
	//创建xml文件的对象
	File f=new File("D:\\Workspaces\\For Android\\Test\\src\\neuq\\test\\dom\\users.xml");
	 /* 
	 *  读
	 *
	 * 遍历所有节点:打印所有user的所有信息
	 * 
	 * 
	 */
	@Test
	public void testReadAllByDom() throws Exception{
		//加载users.xml文件得到一个Document对象
			//创建一个文档解析器工厂对象
			DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
			//根据工程对象得到解析器对象
			DocumentBuilder builder=documentBuilderFactory.newDocumentBuilder();
			//用解析器对象解析xml文件得到Document对象
			Document document=builder.parse(f);
			System.out.println(document);
			//Document包含xml文件的所有内容
			
		//根据Document拿到根标签users
			Element rootEle=document.getDocumentElement();
		//根据根标签users拿到所有的子标签user的集合
			NodeList nodeList=rootEle.getElementsByTagName("user");
		//遍历集合,拿到每个Element,并拿到每个Element内的数据
			for(int i=0;i<nodeList.getLength();i++){
				Element userEle=(Element) nodeList.item(i);
				//拿到id属性
				String id=userEle.getAttribute("id");
				//拿到name子标签
				Element nameEle=(Element) userEle.getElementsByTagName("name").item(0);
					//拿到name子标签中的值
					String name=nameEle.getTextContent();
				//拿到password子标签
				Element passwordEle=(Element) userEle.getElementsByTagName("password").item(0);
					//拿到password子标签中的值
					String password=passwordEle.getTextContent();
				//打印出来
				System.out.println("id="+id+"----"+"name="+name+"----"+"pasword="+password);
			}
	}
	 /* 
	  * 读
	  * 
	  * 查找某一个节点:查找张三的密码
	  * 
	  * 
	  */
	@Test
	public void testReadSpecifiedByDom() throws Exception{
		//加载user.xml文件得到Document对象   直接通过方法链得到
		Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
		//通过文档拿到根标签
		Element rootEle=document.getDocumentElement();
		//通过根标签拿到所有子标签的集合NodeList
		NodeList nodeList=rootEle.getElementsByTagName("user");
		//遍历NodeList
		String temp="张三";
		for(int i=0;i<nodeList.getLength();i++){
			Element userEle=(Element) nodeList.item(i);
			//拿到name子标签
			Element nameEle=(Element) userEle.getElementsByTagName("name").item(0);
			//判断name子标签的text是否为张三
			if(temp.equals(nameEle.getTextContent())){
				Element passwordEle=(Element) userEle.getElementsByTagName("password").item(0);
				String password=passwordEle.getTextContent();
				System.out.println(password);
				return;
			}
		}	
	}
	
	/*
	 * 删
	 * 删除某个节点:删除id为008的节点
	 * 
	 */
	@Test
	public void testDeleteByDom() throws Exception{
		//加载users.xml得到Document对象
		Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
		//得到所有user标签的集合
		NodeList nodeList=document.getDocumentElement().getElementsByTagName("user");
		//遍历这个集合
		for(int i=0;i<nodeList.getLength();i++){
			//得到user标签对象
			Element userEle=(Element) nodeList.item(i);
			//得到其属性id
			String id=userEle.getAttribute("id");
			//判断属性值是否等于008
			if("0001".equals(id)){
				//相同  删除这个user标签 (用父标签来删除)
				userEle.getParentNode().removeChild(userEle);
						//将document对象写到users.xml中去
						saveDocument(document);
						//提示删除成功,return
						System.out.println("删除成功!");
				return;
			}
			//没有找到相应的用户
		}
		System.out.println("没有找到相应用户");
	}
	
	/*
	 * 改
	 * 更新某一个节点:将用户张三的密码更新为abc
	 * 
	 */
	@Test
	public void testUpdateByDom() throws Exception{
		//加载users.xml文件,拿到Document对象
		Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
		//拿到根标签|
		Element rootEle=document.getDocumentElement();
		//拿到根标签下所有的子标签
		NodeList nodeList=rootEle.getElementsByTagName("user");
		//遍历子标签
		for(int i=0;i<nodeList.getLength();i++){
				//拿到user子标签
				Element userEle=(Element) nodeList.item(i);
				//拿到name子标签
				Element nameEle=(Element) userEle.getElementsByTagName("name").item(0);
				//判断   name的text是否为张三
				if("张三".equals(nameEle.getTextContent())){
					//相同 
						//拿到password子标签
						Element passwordEle=(Element) userEle.getElementsByTagName("password").item(0);
						//更改password的text的值
						passwordEle.setTextContent("abc");
						//保存document对象到文件中区
						saveDocument(document);
						//提示更改成功,返回
						System.out.println("更改成功");
						return;
				}
		}
		System.out.println("没有找到指定标签");
		//没有找到指定标签,更新失败	
	}
	
	/*
	 * 增
	 * 添加某一个节点: 姓名:Dean,id:005,密码:5
	 * 
	 */
	@Test
	public void testCreateByDom() throws Exception{
	//加载users.xml文件,拿到Document对象
	Document document=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f);
	//拿到根节点
	Element rootEle=document.getDocumentElement();
	//创建user子标签
	Element userEle=document.createElement("user");
			//添加属性
			userEle.setAttribute("id", "005");
			//创建name,password子标签
			Element nameEle=document.createElement("name");
			Element passwordEle=document.createElement("password");
			//为子标签添加值
			nameEle.setTextContent("Dean");
			passwordEle.setTextContent("5");
			//添加到user标签中去
			userEle.appendChild(nameEle);
			userEle.appendChild(passwordEle);
	//将user标签添加到users标签中去
	rootEle.appendChild(userEle);
	//保存
	saveDocument(document);
	//添加成功
	System.out.println("添加成功");
	
		
		
	}
	/*
	 * javax.xml.transform包中的Tranformer类用于把代表xml文件的Document对象转换为
	 * 某种格式后进行输出
	 * 
	 * 将Document对象的数据保存到xml文件中去,与获取Document对象是互逆的过程
	 */

	private void saveDocument(Document document) throws Exception {
		//将Document对象的数据保存到xml文件中去,与获取Document对象是互逆的过程
			//获取转换器工厂对象
			TransformerFactory transformerFactory=TransformerFactory.newInstance();
			//获取转换器实例
			Transformer transformer=transformerFactory.newTransformer();
			//将document写入到源文件
			DOMSource xmlSource=new DOMSource(document);
			StreamResult outputTarget=new StreamResult(f);
			transformer.transform(xmlSource, outputTarget);
	}
}











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值