码迷,mamicode.com
首页 > 其他好文 > 详细

DOM解析XML

时间:2015-06-30 23:46:50      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:xml   dom   

DOM的文档驱动

处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象

优点是:可以对XML文档进行增删改查的复杂操作,可以随时按照节点间的关系访问数据

缺点:

受内存容量限制,不能处理大的文档,由于没有索引机制,处理效率较低

DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来 操组整个树结构,其他点如下:

优点:整个文档树都在内存当中,便于操作;支持删除、修改、重新排列等多功能。

缺点:将整个文档调入内存(经常包含大量无用的节点),浪费时间和空间。

使用场合:一旦解析了文档还需要多次访问这些数据,而且资源比较充足(如内存、CPU等)。

为了解决DOM解析XML引起的这些问题,出现了SAXSAX解析XML文档为事件驱动


package com.huang;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

//测试DOM在XML文件上的CURD操作
//在XML中换行和标签中的内容在遍历过程中若不加判断则会输出#text


public class DOM {

	public static void main(String[] args) {
	
		//获取抽象类的实例
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try{
			DocumentBuilder db = dbf.newDocumentBuilder();
			Document document = db.parse("./src/data.xml");
			
			//遍历XML表中的内容
			list(document);
			
			//查询XML表中第一个Student的姓名
			//find(document);
			
			//在XML表中插入一个学生的信息
			//add(document);
			
			//在XML表中修改属性和元素值
			//update(document);
			
			//在XML表中删除一个学生或者属性 
			//del(document);
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	// 遍历xml中所有元素
	// 在XML中换行和标签中的内容在遍历过程中若不加判断则会输出#text
	public static void list(Node node) {
		if (node.getNodeType() == node.ELEMENT_NODE) {
			System.out.println(node.getNodeName());
		}
		NodeList nodelist = node.getChildNodes();

		for (int t = 0; t < nodelist.getLength(); ++t) {
			Node n = nodelist.item(t);
			list(n);
		}
		return;
	}
		
	//在XML表中删除一个学生或者属性
	public static void del(Document document) throws TransformerException{
		Element node = (Element)document.getElementsByTagName("student").item(0);
		//移除属性
		node.removeAttribute("id");
		
		//移除元素
		Element name = (Element) node.getElementsByTagName("name").item(0);
		node.removeChild(name);
		
		//获得父亲结点
		//Node parentnode = node.getParentNode();
		//parentnode.removeChild(node);
		
		//写入文件XML中
		TransformerFactory tff = TransformerFactory.newInstance();
		Transformer tf = tff.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
		
	}
	
	
	
	//在XML表中修改一个学生的信息
	public static void update(Document document){
		try{
			Element stuName = (Element) document.getElementsByTagName("name").item(0);
			stuName.setTextContent("zhang");
			stuName.setAttribute("小名", "zhangsan");
			
			//写入文件XML中
			TransformerFactory tff = TransformerFactory.newInstance();
			Transformer tf = tff.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	
	//在XML表中插入一个学生的信息
	public static void add(Document document){
		try{
			Element stu = document.createElement("student");
			//添加属性
			stu.setAttribute("学生称号", "tiger");
			Element name = document.createElement("name");
			name.setTextContent("Ben");
			Element studentid = document.createElement("studentid");
			studentid.setTextContent("123321");
			Element sex = document.createElement("sex");
			sex.setTextContent("男");
			
			stu.appendChild(name);
			stu.appendChild(studentid);
			stu.appendChild(sex);
			
			//在根节点后面添加元素
			document.getDocumentElement().appendChild(stu);
			
			//写入文件XML中
			TransformerFactory tff = TransformerFactory.newInstance();
			Transformer tf = tff.newTransformer();
			tf.transform(new DOMSource(document), new StreamResult("src/data.xml"));
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
	
	
	//查询XML表中第一个student的姓名
	public static void find(Document document){
		NodeList nodelist = document.getElementsByTagName("student");
		//类型强制转换转换成子类Element类型
		Element stu = (Element)nodelist.item(0);
		//获得属性值
		System.out.println("id : "+ stu.getAttribute("id"));
		NodeList name = stu.getElementsByTagName("name");
		Element firstname = (Element)name.item(0);
		//获得元素值
		System.out.println("name : " + firstname.getTextContent());		
	}
	
	
	
	
	
	

}

运行结果:

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

DOM解析XML

标签:xml   dom   

原文地址:http://blog.csdn.net/u012432475/article/details/46701037

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!