XML解析——DOM

  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"));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值