XML解析——DOM

来源:互联网 发布:装配线排程算法 编辑:程序博客网 时间:2024/06/07 02:56
  1. DOM(Document Object Model)
    DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的。
    【优点】
    ①允许应用程序对数据和结构做出更改。
    ②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
    ③基于树结构,比较耗资源,适用于多次访问XML。
    【缺点】
    ①通常需要加载整个XML文档来构造层次结构,消耗资源大。

2.DOM读取XML的步骤:
1、创建解析器工厂对象
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
2、由解析器工厂对象创建解析器对象
DocumentBuilder db=dbf.newDocumentBuilder();
3、由解析器对象对指定的XML文件进行解析,构建相应的DOM树,创建Document对象。
Document document=db.parse(“XML文件路径”);

3.对XML文件进行查询,修改和删除。
1、查询。(对TEXT_NODE类型的节点,输出其text) 方法: print(document);

  public static void print(Node n) {  //把document转为Node型        //获取所有的孩子节点        NodeList nl = n.getChildNodes();         for (int i = 0; i < nl.getLength(); i++) {            Node node = nl.item(i);            //判断是否为TEXT_NODE类型,true 的话就继续判断            if (node.getNodeType() == Node.TEXT_NODE) {                  //XML中换行空格也是一种节点,需要把他们去掉,要不然输出时会有很多空格                if (!"".equals(node.getTextContent().trim())) {                    //打印文本                    System.out.println(node.getTextContent());                }            } else {                //不是TEXT_NODE类型,则进行递归判断,直到打印出所有的TEXT_NODE类型                print(node);            }        }    }  

2、更新节点 update(Node node);
1.先找到你所要改的节点:
Node n1= doc.getElementsByTagName(“student”).item(0);//如,我要找所有student的节点的 第一个student,把它当参数穿进去。

    public static void update(Node node) {        //判断是ELEMENT_NODE类型的结点,        if (node.getNodeType() == Node.ELEMENT_NODE) {            //Node转换为子类Element,有更多的方法            Element element = (Element) node;            //设置属性            element.setAttribute("address", "北京");            //得到子节点name中的第一个(因为一个student中,其实可以设置很多个<name>标签,我们这只有一个,所以取其第一个)            Element name = (Element) element.getElementsByTagName("name").item(0);            //设置文本            name.setTextContent("奥巴马");        }    }

3、删除节点 remove(Document doc);

public static void remove(Document doc) {        //获取第2个student ,删除它        Element e = (Element) doc.getElementsByTagName("student").item(2);        //先获取它的父节点,再通过父节点删除自己(自己不能删除自己)        e.getParentNode().removeChild(e);    }

4、新增节点 add(Document doc);

public static void add(Document doc) throws Exception {        // 先找到跟元素,因为DOM是树状,的找到跟节点再去添加分支        Element root = (Element) doc.getElementsByTagName("students").item(0);        // 创建一个student        Element student = doc.createElement("student");        // 设置属性        student.setAttribute("address", "长沙");        // 创建ID name course scores        Element ID = doc.createElement("id");        ID.setTextContent("3");        Element name = doc.createElement("name");        name.setTextContent("瑞文");        Element course = doc.createElement("course");        course.setTextContent("英雄联盟");        Element scores = doc.createElement("scores");        scores.setTextContent("120");        // 把它们都加到student里面去        student.appendChild(ID);        student.appendChild(name);        student.appendChild(course);        student.appendChild(scores);        // 再把student 加到root 下面        root.appendChild(student);        // 把他写入XML文档        transformTo(doc);    }

5、以上的操作都是把XML读入内存里面,在内存里面进行修改,而我们就要把我们修改后的内存里面的XML 写入到实际的(硬盘)的XML中。 transformTo(Document doc);

public static void transformTo(Document doc) throws Exception {        // 同样的得到转换工厂        TransformerFactory factory = TransformerFactory.newInstance();        //获得其实例        Transformer transformer = factory.newTransformer();        //这个是用来限制格式的,但是你的XML文件就要有一个DTD 文件,在文件写入时,会按照你的DTD文件的格式来,而不会全部都挤在一行        transformer.setOutputProperty(javax.xml.transform.OutputKeys.DOCTYPE_SYSTEM, doc.getDoctype().getSystemId());        //2个参数,第一个是源,即你的document,第二个是输出流,指向你的XML文件路径。也可以查API        transformer.transform(new DOMSource(doc), new StreamResult("20160829/students.xml"));    }
0 0
原创粉丝点击