DOM解析XML

来源:互联网 发布:矩阵lu分解例题 编辑:程序博客网 时间:2024/05/21 17:09

DOM的文档驱动

处理DOM的时候,我们需要读入整个的XML文档,然后在内存中创建DOM树,生成 DOM树上的每个Node对象

优点是:可以对XML文档进行增删改查的复杂操作,可以随时按照节点间的关系访问数据

缺点:

受内存容量限制,不能处理大的文档,由于没有索引机制,处理效率较低

DOM(文档对象模型),为XML文档的解析定义了一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,然后代码就可以使用DOM接口来 操组整个树结构,其他点如下:

优点:整个文档树都在内存当中,便于操作;支持删除、修改、重新排列等多功能。

缺点:将整个文档调入内存(经常包含大量无用的节点),浪费时间和空间。

使用场合:一旦解析了文档还需要多次访问这些数据,而且资源比较充足(如内存、CPU等)。

为了解决DOM解析XML引起的这些问题,出现了SAXSAX解析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中换行和标签中的内容在遍历过程中若不加判断则会输出#textpublic 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中换行和标签中的内容在遍历过程中若不加判断则会输出#textpublic 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());}}

运行结果:


0 0
原创粉丝点击