javaSE学习笔记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解析。
时间: 2024-10-06 15:25:12

javaSE学习笔记XML解析技术(5)的相关文章

javaSE学习笔记SAX解析(6)

SAX即Simple Api for Xml就是一个简单的操作XML数据的一套SUN提供的API机制. SAX采用的解析的原理是基于事件触发的机制. SAX技术只能进行XML数据的读取. 1.准备需要解析的XML文件linkmans.xml<?xml version="1.0" encoding="UTF-8" standalone="no"?> <linkmans> <linkman> <name>

javaSE学习笔记DOM4J解析(7)

DOM4J即Document Object Model for Java使用java技术以文档方式解析XML数据的模型. DOM4J是开源组织提供的一个免费的.强大的XML解析工具,如果开发者需要在项目中使用那么需要下载并引入jar包. dom4j is an Open Source XML framework for Java. dom4j allows you to read, write, navigate, create and modify XML documents. dom4j i

JavaWeb学习笔记——XML解析

DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding="UTF-8"?> <addresslist> <linkman> <name>张三</name> <email>www.baidu.com</email> </linkman> <linkman>

JavaSE 学习笔记之反射技术(二十四)

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

xml解析技术

本文总结Dom,sax解析,  使用Java作为工具解析xml文档. 1 Dom 综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的标签(属性)和Dom树 中的节点一 一对应.节点都是对象,这样就可以使用对象的属性或者方法就操作xml. 缺点:每一种技术都会有缺点,Dom解析的不足之处在于不是处理数据量大的xml文件,原因:Dom技术是直接将xml解析成树,装入到内存中, 这样消耗的资源会比较多. 以下面Myclass.xml为

WebService学习笔记-XML&Schema&HTTP

XML约束 在XML技术里,可以编写一个文档(文件)来约束一个XML文档的书写规范,这称之为XML约束 1.namespace 相当于schema文件的id 2.targetNamespace属性 用来指定schema文件的namespace的值 3.xmlns属性 引入一个约束, 它的值是一个schema文件的namespace值 4.schemaLocation属性 用来指定引入的schema文件的位置 schema规范中: 1. 所有标签和属性都需要有schema文件来定义 2. 所有的s

Java网络编程丶数据库编程丶XML解析技术。

Java网络编程 物理层. 数据链路层. 网络层. 传输层. 会话层. 表示层. 应用层. TCP/IP分层接口包括用于协作层分别完成以下的功能: 网络接口层. 网络互联层. 传输层. 应用层. 套接字: Socket.套接字.是一种抽象层. // 创建客户端Socket向服务器发起连接请求 Socket socket = new Socket("127.0.0.1", 30001); /* 利用已建立的socket创建输入输出流,处理与服务器端的连接 */ // 向服务器写入数据 B

javasE学习笔记:关键字super的使用

/* super 的作用: 1 . super可以在子类中引用父类的成员,通过 .的方式和属性.this相对应. 2. 在子类的构造方法中可以可使用super(参数列表)语句调用父类的构造方法 3. 注意: 子类的构造方法中一定要调用父类的构造方法.... */ javasE学习笔记:关键字super的使用,布布扣,bubuko.com

Java XML解析技术

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已.基本的解析方式有两种,一种叫SAX,另一种叫DOM. DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作.通过DOM接口,应用程