码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-03-13 14:09:07      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/zhenghongxin/p/4334837.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!