您的位置:首页 > 其它

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

2013-06-23 14:15 405 查看
XML 解析原理 : DOM SAX

DOM:

优点:增删改查快

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

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

SAX:

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

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

技术::调整JVM的内存大小

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

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

在MyEclipse中 Run As ——Open Run Other—— VM 框里协商上面参数

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

JAXP (SUN公司) jdom dom4j

一般都用dom4j

JAXP: 这里用的DOM解析

要导入包import javax.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,先用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")));

}

// 对文档进行指定位置添加属性 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")));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: