xml解析之----DOM解析

DOM模型(documentobject model)

?DOM解析器在解析XML文档时,会把文档中的全部元素。依照其出现的层次关系。解析成一个个Node对象(节点)。

?在dom中。节点之间关系例如以下:

?位于一个节点之上的节点是该节点的父节点(parent)

?一个节点之下的节点是该节点的子节点(children)

?同一层次,具有同样父节点的节点是兄弟节点(sibling)

?一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点

lNode对象提供了一系列常量来代表结点的类型,当开发者获得某个Node类型后,就能够把Node节点转换成对应的节点对象(Node的子类对象),以便于调用其特有的方法。

(查看API文档)

lNode对象提供了对应的方法去获得它的父结点或子结点。编程人员通过这些方法就能够读取整个XML文档的内容、或加入、改动、删除XML文档的内容了。

首先引出要解析的xml文件:

<?

xml version="1.0" encoding="UTF-8"?

><书架>
	<书>
		<书名>javaweb开发</书名>
		<作者 id="12">张孝祥</作者>
		<售价>59元</售价>
	</书>
	<书>
		<书名>JavaScript网页开发</书名>
		<作者>张孝祥</作者>
		<售价>28.00元</售价>
	</书>
</书架>

下面即是对xml的增删改查操作:

import java.io.FileOutputStream;

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

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

public class Demo3 {

	/**
	 * 利用dom完毕文档的crud
	 * @param args
	 * @throws Exception
	 * @throws ParserConfigurationException
	 * @throws Exception
	 * @throws SAXException
	 * @throws Exception
	 */
	private Document document;
	@Before
	public void before() throws Exception{
		//获得dom解析工厂类
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		//得到dom解析器
		DocumentBuilder builder = factory.newDocumentBuilder();
		//解析xml文件
		document = builder.parse("src/book.xml");
	}

	//遍历
	@Test
	public void listXml() throws ParserConfigurationException, SAXException, Exception{
		list(document);
	}

	public void list(Node node){
		//打印结点的名称
		System.out.println(node.getNodeName());
		//获得全部子节点
		NodeList list = node.getChildNodes();
		for(int i=0;i<list.getLength();i++){
			Node child = list.item(i);
			//递归整个dom树
			list(child);
		}
	}

	//读取书名节点的值:<书名>javaweb开发</书名>
	@Test
	public void test1(){
		Document document = this.document;
		Node node = document.getElementsByTagName("书名").item(0);
		String value = node.getTextContent();
		System.out.println(value);
	}

	//读取书名属性的值:<售价 type="rmb">39.00元</售价>
	@Test
	public void test2(){
		Document document = this.document;
		Node node = document.getElementsByTagName("售价").item(0);
		Element price =  (Element) node;   //发现node满足不了。把node强转成对应类型
		String attValue = price.getAttribute("type");
		System.out.println(attValue);
	}

	//向xml文档中加入售价节点
	@Test
	public void test3() throws Exception{
		Document document = this.document;
		//创建要挂的节点
		Element price = document.createElement("售价");
		price.setTextContent("59元");
		//把创建的结点挂到书节点下
		Node book = document.getElementsByTagName("书").item(0);
		book.appendChild(price);

		//把内存中更新后对象树,又一次定回到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}

	//向xml文档中指定位置上加入售价节点
	@Test
	public void test4() throws Exception{
		Document document = this.document;

		//创建要加入的节点
		Element price = document.createElement("售价");
		price.setTextContent("59元");

		//得到要向哪个节点上挂子节点
		Node book = document.getElementsByTagName("书").item(0);

		//向參考节点前,挂新节点
		book.insertBefore(price, document.getElementsByTagName("售价").item(0));

		//把内存中更新后对象树,又一次定回到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));

	}

	//向xml文档加入节点属性
	@Test
	public void test5() throws Exception{
		Document document = this.document;

		//得到要加入属性的节点
		Element author = (Element) document.getElementsByTagName("作者").item(0);
		author.setAttribute("id", "12");  //向节点挂属性

		//把内存中更新后对象树,又一次定回到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));

	}

	//删除xml文档中的售价节点
	@Test
	public void test6() throws Exception{

		Document document = this.document;

		//得到要删除的节点
		Node price = document.getElementsByTagName("售价").item(0);

		//得到要删除的节点的父亲
		Node parent = document.getElementsByTagName("书").item(0);

		parent.removeChild(price);

		//把内存中更新后对象树,又一次定回到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}

	//删除2   : 删除售价节点所在的书结点
	@Test
	public void test7() throws Exception{

		Document document = this.document;

		//得到要删除的节点
		Node price = document.getElementsByTagName("售价").item(0);
		price.getParentNode().getParentNode().removeChild(price.getParentNode());

		//把内存中更新后对象树。又一次定回到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}

	@Test
	public void test8() throws Exception{
		Document document = this.document;
		document.getElementsByTagName("售价").item(1).setTextContent("19元");
		//把内存中更新后对象树。又一次定回到xml文档中
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer tf = factory.newTransformer();
		tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml")));
	}

}
时间: 2024-12-21 06:19:31

xml解析之----DOM解析的相关文章

Java学习总结(21)——XML文档解析:DOM解析,SAX解析

一.XML简介1.可扩展性标记语言(eXtensible Markup Language)2.XML用于描述数据3.应用场合:(1)持久化存储数据(2)数据交换(3)数据配置4.XML语法(1)文档类型:在编写XML文档时,需要先使用文档声明,声明XML文档的类型.最简单的声明语法:<?Xml version="1.0" ?>用encoding属性说明文档的字符编码:<?Xml version="1.0" encoding="GB2312

Java---XML的解析(1)-DOM解析

本章只讲DOM解析.接下来还会学习Dom4j和StAX 解析技术 DOM解析: DOM解析一次将所有的元素全部加载到内存中:如有以下XML文档: <user> <name>Jack</name> <age>30</age> </user> 由于DOM解析,一次性的将所有元素(包含属性和文本) 全部加载到内存中,所以不适用于解析大量的数据. JAXP-DOM解析: 包: javax.xml.parse – 关键类DocumentBuil

XML文件解析之DOM解析

XML文件是一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.基本的解析方式包括DOM解析和SAX解析,具体来说包括DOM解析,SAX解析,DOM4J解析以及JDOM解析,首先来讲下DOM解析的具体实现方式: 1.重要的对象 DocumentBuilderFactory: 创建文档解析器的工厂对象 DocumentBuilder :得到文档解析器对象,由工长对象获取 Document :文档对象 2.解析XML实现方式 XML文件: <?xml v

java中的xml简介与DOM解析xml

1. xml简介 XML:指可扩展标记语言, Extensible Markup Language:类似HTML.XML的设计宗旨是传输数据,而非显示数据. 一个xml文档实例: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <company name="Tencent" address="深圳市南山区"> 3 <department deptNo=&quo

XML解析之DOM解析技术案例

Java代码: package com.xushouwei.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.No

XML解析中DOM解析如何使用第三方的类库

* DOM解析使用Google提供的一个开源高效的XML解析工具GDataXMLNode,他的效果要比NSXMLParser要快10倍 使用方式: 1:先倒入系统动态链接库 libxml2.2.dylib 在项目的Targets – Summary – Linked Frameworks and Libraries或者在Targets – Build Phases – Link Binary With Libraries添加libxml2.2.dylib 2:在bulidSettings中的He

JavaWeb-05 XML基础(Dom解析和Sax解析)

JavaWeb-05 JavaWeb-XML基础(Dom解析和Sax解析) 一.XML的概述(了解) eXtensible Markup Language 可扩展标记语言 宗旨是传输数据,而非显示数据. XML标签没有被预定义,需要用户自行定义标签. XML技术是W3C组织(WorldWideWeConsortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范. 作用: a. 传输数据 b. 配置文件(主要用途) XML技术用于解决什么问题? a. XML语言出现

SAX解析与DOM解析

SAX解析实例:http://www.iteye.com/topic/763895 Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode. 为了更好地解决大型 XML 处理的问题,Java 开发人员发明了 SAX.SAX 采用事件驱动的方式来处理 XML,它的处理方式是:为每一个元素.属性.内容(这些都认为是事件)定义一个回调方法,这个回调方法由应用程序提供.解析器以数据流的方式

xml 数据的 DOM 解析方式

需要使用第三方工具 #import "GDataXMLNode.h" // 懒加载,使用的时候在进行初始化 // 相对而言的是属性才有懒加载,需要重写getter方法 - (NSMutableArray *)xmlDOMArray { if (_xmlDOMArray == nil) { _xmlDOMArray = [NSMutableArray array]; } return _xmlDOMArray; } @property (nonatomic, strong) NSMuta