小东吖 之 java Dom4j 解析 XML文档

xml文档解析
* xml文档是用来存放数据 这些数据需要被程序传递并使用
* 但xml语法有别于使用它的语言的语法(如: java),所以需要根据java语法及xml文档规则,
* 将xml存储的数据转换成想使用它的语言 能使用的数据 这种过程就叫 xml文档解析
* 应用: 因为xml文档在各语言基础定义一致 且解析逻辑一致 顾用于各语言之间进行数据传输
*
* xml 常用解析规则
* Dom Document Object Model 是面向文档结构树的对象模型
* (DOM是将整个xml加载到内存再读取,如果xml特别大,会影响系统新能,适用于解析小文件xml,可以读取任意位置节点)
*
* 优点: 可以清晰的展示节点的层次关系 节点之间的联代关系
* 具有强大的节点操作功能
* 缺点: 该方式会将整个文档解析的DOM树 整体存在内存中 不利于XML
* 大文档型操作
*
* SAX Simple API for XML
* 原理: SAX是面向文档接口的逻辑(推)模型解析
* 优点: 具有快速处理XML文档的能力 节约内存(根据需求进行必要的局部解析 且前后解析具有很大的灵活性)
* 缺点: 无法标注节点之间的层次关系 节点功能操作获取途径单一化
* Dom4j
* 特点: 整合各语法解析优点 具有灵活的DOM文档树的内存印象解析
* (把整个树的数据存放在内存中 而不是整个文档 通过SAX面向接口 获取方法去调用)
*/

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它.
对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

使用Dom4j开发,需下载dom4j相应的jar文件

一. 获取xml文档


        // 1. 通过SAXReader() 空控制器 生成操作XML的输入流
        SAXReader reader = new SAXReader();
        // 2. 通过操作时(读取动作),再于文件或流建立起直接关系
        // 获取文档
        // 先创建文件的File实例对象
        File file = new File(Files.getPath(Files.d_s,"lesson","xml"), "School.xml");
        // 获取Document的对象
        Document document = reader.read(file); 

二. 数据相关操作

        // 2.获取文档的跟节点
        Element element = document.getRootElement();
            Element root = document.getRootElement();
        // 3. 获取节点内容(String类型)
        String string = root.getTextTrim();
        System.out.println(string);
        // 4. 获取节点属性
        Attribute att = root.attribute("value");
        System.out.println(att.getText());
        // 5. 获取节点属性值
        // 一一对象关系 map
        String key = att.getName();
        String value = att.getValue();
        System.out.println(key + "-" + value);
        // 6. 获取子节点
        List<Element> list = root.elements();
        for (Element element : list) {
            // 7. 获取子节点的名字
            System.out.println(element.getName());
        }
        // 8. 获取指定子节点
        Element stus = root.element("Students");
        System.out.println(stus);
        // 9. 获取父节点
        Element parent = stus.getParent();
        System.out.println(parent);

举个例子 看下代码 附XML文件

        // 怎么去获取节点下的所有子节点
        // 遍历
        // 获取其子节点
        // 老师们
        Element teas = element.element("Teachers");
        // 学生们
        Element stus = element.element("Students");
        // 获取老师们下的子节点
        List<Element> tea = teas.elements();
        // 对老师们的所有子节点遍历
        for (Element ele : tea) {
            List<Element> list = ele.elements();
            System.out.println(ele.attribute("id").getText());
            for (Element element2 : list) {
                System.out.println(element2.getName()+ "--" + element2.getText());
            }
        }

        // 获取学生们的子节点
        List<Element> stu = stus.elements();
        for (Element ele : stu) {
            System.out.println(ele.attribute("num").getText());
            List<Element> e = ele.elements();
            for (Element element2 : e) {
                System.out.println(element2.getName() + "--" + element2.getTextTrim());
            }
        }

School XML文件

<?xml version="1.0" encoding="UTF-8"?>
<School value="老师+学生">
    <!-- 
        CDATA语法:该语法规定语法内的文字为XML语法不解析内容 
        CDATA内的文字为纯文本
    -->
    <![CDATA[
        <省重点>民办高级小学生聚集地
    ]]>
    学校
    <Teachers name="老师">
        <Teacher id="10000">
            <name>王大锤</name>
            <gender></gender>
            <subject>艺术</subject>
            <salary>800/天</salary>
        </Teacher>
        <Teacher id="10086">
            <name>毕小索</name>
            <gender></gender>
            <subject>美术</subject>
            <salary>500/天</salary>
        </Teacher>
        <Teacher id="10010">
            <name>苍肖锋</name>
            <gender></gender>
            <subject>生物</subject>
            <salary>1000/天</salary>
        </Teacher>
    </Teachers>

    <Students name="学生">
        <Student num="001">
            <name>王尼玛</name>
            <gender></gender>
            <class>一班</class>
        </Student>
        <Student num="002">
            <name>康师傅</name>
            <gender></gender>
            <class>三班</class>
        </Student>
        <Student num="003">
            <name>张全蛋</name>
            <gender></gender>
            <class>二班</class>
        </Student>
        <Student num="004">
            <name>马小璐</name>
            <gender></gender>
            <class>八班</class>
        </Student>
    </Students>
</School>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值