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解析。

 

你可能感兴趣的:(Java学习)