加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML的dom和Sax解析,以及JAXP的DOM的crud

发布时间:2020-12-16 05:26:34 所属栏目:百科 来源:网络整理
导读:XML 解析原理 :DOMSAX DOM: 优点:增删改查快 缺点:把文档变成对象,占内存,对大文件不易操作,解析速度慢 DOM解析下, XML 的每一个组成部分都会用一个对象表示,例如标签有那个 Elment, 属性用 Attr, ,但不管什么对象,都是 Node 的子类,所以在开发中可
XML 解析原理 :DOMSAX

DOM:

优点:增删改查快

缺点:把文档变成对象,占内存,对大文件不易操作,解析速度慢

DOM解析下,XML的每一个组成部分都会用一个对象表示,例如标签有那个Elment,属性用Attr,,但不管什么对象,都是Node的子类,所以在开发中可以把获取到的任意节点都当做Node对待.

SAX:

优点:占内存小,一点一点的读取,解析速度快

缺点:由上到下,不易增删改查,只适合做读取,不适合CRUD(增删改查)

技术:调整JVM的内存大小

默认JVM的内存大小为:64M

启动虚拟机的时候后面要带个参数-Xmx80m(创建80M的内存空间,注意第一个X是大写)

MyEclipseRunAs——OpenRunOther——VM框里协商上面参数

使用解析包:共有三种这里只讲两种jaxpdom4j

JAXP(SUN公司)jdomdom4j

一般都用dom4j

JAXP: 这里用的DOM解析

要导入包importjavax.xml.*;



这是XML文档:


<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架>
	<书>
		<书名>第一本书</书名>
		<作者>六道01</作者>
		<售价>100</售价>
	</书>
	<书>
		<书名>第二本书</书名>
		<作者>六道01</作者>
		<售价>200</售价>
	</书>
</书架>




******************************************************

这是对XML文档进行操作



import java.io.FileInputStream;
import java.io.FileOutputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.*;

/**
 * 对XML文件进行crud(增删改查)
 * 
 * @author Administrator
 * 
 */
public class Demo2
{
	// 读取XML文档中 标签的内容
	@Test
	public void read() throws Exception
	{
		// 和上面的例子一样 的流程 创建工厂
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		// 得到dom解析器
		DocumentBuilder builder = factor.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/MyBook.xml");

		// 获得标签 是list
		NodeList list = document.getElementsByTagName("书名");
		// 节点node,第0个节点 item 获得节点
		Node node = list.item(0);
		// 获取Text (Content)内容 。返回的是字符串
		String content = node.getTextContent();
		// 打印
		System.out.println(content);

	}

	@Test
	public void read2() throws Exception
	{
		// 和上面的例子一样 的流程 创建工厂
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		// 得到dom解析器
		DocumentBuilder builder = factor.newDocumentBuilder();
		// 解析XML文档
		Document doucument = builder.parse("src/MyBook.xml");
		// 得到根节点
		Node root = doucument.getElementsByTagName("书架").item(0);

		list(root);

	}

	private void list(Node node)
	{
		// 可以先进行判断,如果是标签才打印,如果没有这个判断 会打印#test 就是中间的空行
		if (node instanceof Element)
		{
			// 打印获得节点的名字,#text是空行
			System.out.println("标签:" + node.getNodeName());
		}
		// System.out.println(node.getNodeName());
		// 获得节点的子节点list 集合
		NodeList list = node.getChildNodes();

		// 递归调用
		for (int i = 0; i < list.getLength(); i++)
		{
			Node child = list.item(i);
			// 进行递归调用
			list(child);
		}
	}

	// 获得XML文档中标签属性的值: <书名 name="xxxkkk">第一本书</书名>
	@Test
	public void read3() throws Exception
	{
		// 和上面的例子一样 的流程 创建工厂
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		// 得到dom解析器
		DocumentBuilder builder = factor.newDocumentBuilder();
		// 解析XML文档
		Document document = builder.parse("src/MyBook.xml");

		// 将节点类型 强转成 标签类型 ,用标签类型可以获取指定属性 ,节点类型要遍历 麻烦
		Element bookname = (Element) document.getElementsByTagName("书名")
				.item(0);

	}

	// 对文档进行添加 节点 <售价>300</售价>
	@Test
	public void add() throws Exception
	{
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factor.newDocumentBuilder();
		Document document = builder.parse("src/MyBook.xml");

		// 创建节点
		Element price = document.createElement("售价");
		// 添加内容
		price.setTextContent("300");

		// 把创建的节点挂到书节点上,先获得书的节点,第一个标签的书
		Element book = (Element) document.getElementsByTagName("书").item(0);
		// 进行挂靠
		book.appendChild(price);

		/**
		 * 写入硬盘
		 */
		// 上面的只是在内存中改变,现在要在文档中更新 使用Transform,先用TransformFactory对象建立
		TransformerFactory tffactory = TransformerFactory.newInstance();
		// 通过tffactory创建 Transformer对象 tf
		Transformer tf = tffactory.newTransformer();
		// 将内存中数据写入硬盘中,明确源(doucment)内存 目的 (MyBook)硬盘
		tf.transform(new DOMSource(document),new StreamResult(
				new FileOutputStream("src/MyBook.xml")));

	}

	// 对文档进行指定位置添加 节点 <售价>300</售价>
	@Test
	public void add2() throws Exception
	{
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factor.newDocumentBuilder();
		Document document = builder.parse("src/MyBook.xml");

		// 创建节点
		Element price = document.createElement("售价");
		// 添加内容
		price.setTextContent("300");

		// 得到参考节点(第一个售价节点)
		Element refNode = (Element) document.getElementsByTagName("售价").item(0);

		// 得到要挂靠的节点
		Element book = (Element) document.getElementsByTagName("书").item(0);

		// 往book位置的节点指定位置的节点插入 使用 insertBefore
		book.insertBefore(price,refNode);

		/**
		 * 写入硬盘
		 */
		// 上面的只是在内存中改变,现在要在文档中更新 使用Transform,new StreamResult(
				new FileOutputStream("src/MyBook.xml")));

	}

	// 对文档进行指定位置添加属性 name="xxxxx"属性
	@Test
	public void addAttr() throws Exception
	{
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factor.newDocumentBuilder();
		Document document = builder.parse("src/MyBook.xml");

		// 得到书名节点
		Element bookname = (Element) document.getElementsByTagName("书名")
				.item(0);
		// 添加属性
		bookname.setAttribute("name","xxxxxx");

		/**
		 * 写入硬盘
		 */
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document),new StreamResult(
				new FileOutputStream("src/MyBook.xml")));

	}

	// 删除
	@Test
	public void delete() throws Exception
	{
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factor.newDocumentBuilder();
		Document document = builder.parse("src/MyBook.xml");

		// 得到要删除的节点 item(0) 代表第一个
		Element e = (Element) document.getElementsByTagName("售价").item(0);

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

		// 通过父节点删除子节点
		book.removeChild(e);

		// 将更新后的内存写入硬盘
		/**
		 * 写入硬盘
		 */
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document),new StreamResult(
				new FileOutputStream("src/MyBook.xml")));

	}

	// 删除整洁XML文档
	@Test
	public void delete2() throws Exception
	{
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factor.newDocumentBuilder();
		Document document = builder.parse("src/MyBook.xml");

		// 得到要删除的节点 item(0) 代表第一个
		Element e = (Element) document.getElementsByTagName("售价").item(0);

		// 得到她的父节点的父节点的父节点
		e.getParentNode().getParentNode().getParentNode()
				.removeChild(e.getParentNode().getParentNode());

		// 将更新后的内存写入硬盘
		/**
		 * 写入硬盘
		 */
		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document),new StreamResult(
				new FileOutputStream("src/MyBook.xml")));

	}

	// 更新文档,更改售价的价格 改成 250
	@Test
	public void updata() throws Exception
	{
		DocumentBuilderFactory factor = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factor.newDocumentBuilder();
		Document document = builder.parse("src/MyBook.xml");

		// 获得标签,第一个要加item(0)
		Element e = (Element) document.getElementsByTagName("售价").item(0);
		// 改变内容
		e.setTextContent("250元");

		TransformerFactory tffactory = TransformerFactory.newInstance();
		Transformer tf = tffactory.newTransformer();
		tf.transform(new DOMSource(document),new StreamResult(
				new FileOutputStream("src/MyBook.xml")));

	}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读