DOM解析XML

DOM的文档驱动

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

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

缺点:

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

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

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

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

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

为了解决DOM解析XML引起的这些问题,出现了SAX。SAX解析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());
	}

}

运行结果:

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

时间: 2024-12-30 11:12:37

DOM解析XML的相关文章

DOM的概念和简单应用:使用DOM解析XML数据

概念:DOM是Document Object Model的简称,即文档数据模型. Oracle公司提供了JAXP(Java API for XML Processing)来解析XML.JAXP会把XML文档转换成一个DOM树,JAXP的三个包都在JDK中. org.w3c.dom;W3C推荐的解析文档的接口 org.xml.sax;使用SAX解析XML文档的接口 javax.xml.parsers;解析器工厂工具 一.使用DOM解析XML文档的步骤 1.创建解析器工厂对象,即DocumentBu

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

Java从零开始学四十二(DOM解析XML)

一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <PhoneInfo name="手机品牌"> <Brand name="华为"> <Type name="U8650"> </Type> </Brand

org.w3c.dom(java dom)解析XML文档

位于org.w3c.dom操作XML会比较简单,就是将XML看做是一颗树,DOM就是对这颗树的一个数据结构的描述,但对大型XML文件效果可能会不理想 首先来了解点Java DOM 的 API:1.解析器工厂类:DocumentBuilderFactory 创建的方法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 2.解析器:DocumentBuilder 创建方法:通过解析器工厂类来获得 DocumentBu

Android之DOM解析XML

一.DOM解析方法介绍 DOM是基于树形结构的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树,检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息. Android完全支持DOM解析.利用DOM中的对象可以对XML文档进行读取.搜索.修改.添加和删除等操作. DOM的工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素.树形和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并

DOM解析XML文件

除了可以使用SAX解析XML文件,大家也可以使用熟悉的DOM来解析XML文件. DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOMAPI遍历XML树.检索所需的数据.使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单.但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小

Android DOM解析XML方法及优化

在Android应用开发中,我们常常要在应用启动后从服务器下载一些配置文件,这些配置文件包含一些项目中可能用到的资源,这些文件很多情况下是XML文件,这时就要将XML下载到文件中保存,之后再解析XML.解析XML的方法有DOM, SAX, JDOM, DOM4J,本文中只使用了DOM,下面先介绍DOM的基础知识和解析XML的方法,然后再结合一个项目实例来实现从XML文件的下载到解析整个过程. DOM(Document Object Model,文档对象模型)定义了访问和操作XML的标准方法.基于

Dom解析xml,只是简单的解析出有效元素的元素名,元素值,属性名和属性值

DOM使用简单,但只适合于一些小的Xml文档,因为Dom解析Xml文档时,要将其读入内存,生成DOM树. 具体操作方法如下 要解析的XML文档 <persons> <person id="1001"> <name><![CDATA[<>上上</>]]></name> <!-- <![CDATA[<>上上</>]]> 预定义字符3. --> <sex&

使用DOM解析XML文件

首先写了一个xml文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id="1"> <name>c#</name> <author>张三</author> <year>1990</year> <price>60</price> </book&