首页 > 学院 > 开发设计 > 正文

java学习笔记XML解析技术(5)

2019-11-14 23:16:14
字体:
来源:转载
供稿:网友
java学习笔记xml解析技术(5)JAXP技术

JAXP即Java Api for Xml PRocessing该API主要是SUN提供的用于解析XML数据的一整套解决方案,主要包含了DOM和SAX解析技术。大家可以参见SUN的以下两个包:

javax.xml.parsers.* à主要存储的是解析器

org.w3c.dom.*或org.w3c.sax.* à主要存储的是DOM解析或SAX解析需要的API

DOM解析主要采用DOM树的方式进行XML的数据解析。如:JavaScript中的DOM操作

SAX解析主要采用事件的方式进行XML的数据解析。如:Javascript中的事件机制

XML解析原理
  1. 编写需要解析的XML文件
  2. 获取相应的XML解析器对象
  3. 使用API获取数据
  4. 返回数据给开发者
DOM解析

DOM解析采用的是DOM树的方式进行解析。

  1. 准备要解析user.xml文件
<?xml version="1.0" encoding="UTF-8"?><!-- 1. 编写要解析的XML文件 --><users></users>
2.    获取解析器// 2. 提供获取解析器的方法    public static DocumentBuilder getParser()throws Exception{        // 2.1  创建工厂类对象        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();        // 2.2 获取解析器对象        DocumentBuilder parser = factory.newDocumentBuilder();        return parser;    }
3. 获取解析的DOM树对象// 3. 提供获取DOM数据的方法    public static Document getDOM(File file)throws Exception{        // 3.1 获取解析器        DocumentBuilder parser = getParser();        // 3.2解析数据        Document dom = parser.parse(file);        return dom;    }
4. 获取根元素// 4. 提供解析根元素的数据的方法    public static void getRoot(File file)throws Exception{        // 4.1 获取DOM树        Document dom = getDOM(file);        // 4.2遍历dom树找根元素        Node node = dom.getElementsByTagName("users").item(0);        // 4.3输出根元素的名        System.out.println(node.getNodeName());    }
5. 通过关系获取根元素// 4. 提供解析根元素的数据的方法    public static void getRoot(File file)throws Exception{        // 4.1 获取DOM树        Document dom = getDOM(file);        // 4.2遍历dom树找根元素        Node node = dom.getElementsByTagName("users").item(0);        // 4.3输出根元素的名        System.out.println(node.getNodeName());        // 4.4根据节点直接的关系获取根元素        NodeList list = dom.getChildNodes();        Node root = list.item(0);        System.out.println(root.getNodeName());        root = dom.getFirstChild();        System.out.println(root.getNodeName());        root = dom.getLastChild();        System.out.println(root.getNodeName());    }
6. 添加元素// 5. 添加一个user节点    public static Document addElement(File file)throws Exception{        // 5.1获取DOM树        Document dom = getDOM(file);        // 5.2创建user元素        Element user = dom.createElement("user");        Element name = dom.createElement("name");        Element age = dom.createElement("age");        Element address = dom.createElement("address");                name.setTextContent("焦宁波");        age.setTextContent("28");        address.setTextContent("天河区");        // 5.3建立关系        Element root = (Element) dom.getFirstChild();        user.appendChild(name);        user.appendChild(age);        user.appendChild(address);        root.appendChild(user);        // 5.4返回修改后的DOM树对象        return dom;    }
7. 为了让内存中的修改的DOM树持久化到磁盘文件需要定义以下方法// 提供一个工具方法将内存中的DOM树存储到磁盘的指定文件中    public static void writeDOM2XML(Document dom,File file)throws Exception{        // 1.获取转换器的工厂类对象        TransformerFactory factory = TransformerFactory.newInstance();        // 2.获取转换器对象        Transformer trans = factory.newTransformer();        // 3.转换        trans.transform(new DOMSource(dom), new StreamResult(new FileOutputStream(file)));    }
8. 修改元素    // 6. 修改第二个user的年龄为30岁    public static Document modifyElement(File file)throws Exception{        // 6.1获取DOM树        Document dom = getDOM(file);        // 6.2获取第二个age元素        Node age2 = dom.getElementsByTagName("age").item(1);        // 6.3设置文本值        age2.setTextContent("30");        return dom;    }
9. 删除元素// 7. 删除第一个user节点    public static Document removeElement(File file)throws Exception{        // 7.1获取DOM树        Document dom = getDOM(file);        // 7.2获取user的父亲        Node users = dom.getFirstChild();        // 7.2获取需要断绝关系的孩子节点        Node user1 = dom.getElementsByTagName("user").item(0);        // 7.3断绝关系        users.removeChild(user1);        return dom;
10. 加强使用关系获取元素// 8. 使用关系获取节点    public static void searchElement(File file)throws Exception{        // 8.1获取DOM树        Document dom = getDOM(file);        // 8.2获取第二个user的所有的子元素并输入元素名        Element user2 = (Element) dom.getElementsByTagName("user").item(1);        // 8.3获取所有的儿子        NodeList list = user2.getChildNodes();        // 8.4遍历所有的孩子        for(int i = 0;i<list.getLength();i++){            Node node = list.item(i);            System.out.println(node.getNodeName());        }        // 8.5获取第二个user的address元素        Element address2 = (Element) list.item(2);        System.out.println(address2.getNodeName());        Node age2 = address2.getPreviousSibling();        System.out.println(age2.getNodeName());                Element name2 = (Element) list.item(0);        System.out.println(name2.getNodeName());        age2 = name2.getNextSibling();        System.out.println(age2.getNodeName());            }
11. 属性的操作// 9. 属性操作    public static Document optionAttribute(File file)throws Exception{        // 9.1获取DOM树        Document dom = getDOM(file);        // 9.2获取所有的user元素        NodeList list = dom.getElementsByTagName("user");        // 9.3遍历节点        for (int i = 0; i < list.getLength(); i++) {            Element user = (Element)list.item(i);            // 添加属性            user.setAttribute("id", "00"+(i+1));        }        // 9.4 获取属性        Element user2 = (Element) list.item(1);        String value = user2.getAttribute("id");        System.out.println(value);        // 9.5修改属性        user2.setAttribute("id", "007");        // 9.5删除属性        user2.removeAttribute("id");        return dom;    }总结:在实际的项目开发中我们经常遇到的XML数据时比较大的,如果使用DOM进行数据的解析,那么首先在内存中会形成一个DOM树结构。因此容易导致内存的一个溢出。所以不建议大家使用DOM解析进行操作较大的XML数据。如果只是需要进行XML文件的数据获取,那么推荐使用SAX解析。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表