XML
解析原理
:DOMSAX
这是XML文档:
******************************************************
这是对XML文档进行操作
DOM:
优点:增删改查快
缺点:把文档变成对象,占内存,对大文件不易操作,解析速度慢
DOM解析下,XML的每一个组成部分都会用一个对象表示,例如标签有那个Elment,属性用Attr,,但不管什么对象,都是Node的子类,所以在开发中可以把获取到的任意节点都当做Node对待.
SAX:
优点:占内存小,一点一点的读取,解析速度快
缺点:由上到下,不易增删改查,只适合做读取,不适合CRUD(增删改查)
技术::调整JVM的内存大小
默认JVM的内存大小为:64M
启动虚拟机的时候后面要带个参数-Xmx80m(创建80M的内存空间,注意第一个X是大写)
在MyEclipse中RunAs——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"))); } }