核心提示:DOM的文档驱动处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象优点是:可以对XML文档进行增删改查的复杂操作,可以随时按照节点间的关系访问...
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()); } }
运行结果: