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()); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u012432475/article/details/46701037