暑期JAVA学习(47)XML解析技术

一、XML解析技术概述

(1)XML的数据的作用是什么,最终需要怎么处理?
  • 存储数据、做配置信息、进行数据传输。
  • 最终需要被程序进行读取,解析里面的信息。
(2)什么是XML解析
  • 使用程序读取XML中的数据
(3)两种解析方式
  • SAX解析
  • DOM解析
(4)Dom常见的解析工具
名称说明
JAXPSUN公司提供的一套XML的解析的API
JDOMJDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。
dom4j是JDOM的升级品,用来读写XML文件的。具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom 技术,同时它也是一个开放源代码的软件,Hibernate也用它来读写配置文件。
jsoup功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便
(5)DOM解析解析文档对象模型

在这里插入图片描述

(6)Dom解析常用技术框架
  • Dom4J

二、Dom4J解析XML文件

(1)案例:使用Dom4J解析出XML文件
需求
  • 使用Dom4J把一个XML文件的数据进行解析
分析

①下载Dom4j框架,官网下载。
②在项目中创建一个文件夹:lib
③将dom4j-2.1.1.jar文件复制到 lib 文件夹
④在jar文件上点右键,选择 Add as Library -> 点击OK
⑤在类中导包使用

导入Dom4j框架

①下载Dom4j框架,官网下载。

  • 搜索dom4j,进入官网下载
    在这里插入图片描述
    在这里插入图片描述

  • 下载并解压之后如下
    在这里插入图片描述

  • 双击index.html,就可以看到dom4j的API,方便使用
    在这里插入图片描述
    在这里插入图片描述
    ②在项目中创建一个文件夹:lib
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ③将dom4j-2.1.1.jar文件复制到 lib 文件夹

  • 复制dom4j-2.1.1.jar文件在这里插入图片描述
    在这里插入图片描述

  • 将dom4j-2.1.1.jar文件复制到 lib 文件夹
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
④在jar文件上点右键,选择 添加到库 -> 点击确定
在这里插入图片描述
在这里插入图片描述
⑤在类中导包使用

(2)Dom4j解析XML-得到Document对象
①SAXReader类
构造器/方法说明
public SAXReader()创建Dom4J的解析器对象
Document read(String url)加载XML文件成为Document对象
②Document类
方法名说明
Element getRootElement()获得根元素对象

三、Dom4J解析XML文件中的各种节点

(1)Dom4j解析XML的元素、属性、文本
方法名说明
List elements()得到当前元素下所有子元素
List elements(String name)得到当前元素下指定名字的子元素返回集合
Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
String getName()得到元素名字
String attributeValue(String name)通过属性名直接得到属性值
String elementText(子元素名)得到指定名称的子元素的文本
String getText()得到文本
(2)具体实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**
 目标:学会使用dom4j解析XML文件中的数据。
 1、导入dom4j框架。
 2、准备一个XML文件。
 */
public class Dom4JHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception {
        // 1、创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();

        // 2、把XML文件加载到内存中成为一个Document文档对象
        // Document document = saxReader.read(new File("SummerTryTest2\\src\\Contacts.xml")); // 需要通过模块名去定位
        // Document document = saxReader.read(new FileInputStream("SummerTryTest2\\src\\Contacts.xml"));

        // 注意: getResourceAsStream中的/是直接去src下寻找的文件
        InputStream is = Dom4JHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        // 3、获取根元素对象
        System.out.println("-----------------------获取根元素对象------------------------");
        Element root = document.getRootElement();
        System.out.println(root.getName());


        // 4、拿根元素下的全部子元素对象(一级)
        System.out.println("-------------------拿根元素下的全部子元素对象-------------------");
        List<Element> sonEles =  root.elements();
        for (Element sonEle : sonEles) {
            System.out.println(sonEle.getName());
        }

        System.out.println("---------------根据名称拿根元素下的全部子元素对象-----------------");
        List<Element> sonEles2 =  root.elements("contact");
        for (Element sonEle : sonEles2) {
            System.out.println(sonEle.getName());
        }

        System.out.println("-----------------------拿某个子元素-------------------------");
        // 拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());

        System.out.println("----------------------------------------------------------");
        // 默认提取第一个子元素对象 (Java语言。)
        Element contact = root.element("contact");
        // 获取子元素文本
        System.out.println(contact.elementText("name"));
        // 去掉前后空格
        System.out.println(contact.elementTextTrim("name"));
        // 获取当前元素下的子元素对象
        Element email = contact.element("email");
        System.out.println(email.getText());
        // 去掉前后空格
        System.out.println(email.getTextTrim());

        // 根据元素获取属性值
        Attribute idAttr = contact.attribute("id");
        System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
        // 直接提取属性值
        System.out.println(contact.attributeValue("id"));
        System.out.println(contact.attributeValue("vip"));

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>   潘金莲  </name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false">
        <name>武大狼</name>
        <gender>男</gender>
        <email>wuda@itcast.cn</email>
    </contact>
    <user>
    </user>
</contactList>
(3)Dom4J的解析思想
  • 得到文档对象Document,从中获取元素对象和内容。

四、Dom4J解析XML文件-案例实战

(1)XML解析案例
  • 需求:利用Dom4J的知识,将Contact.xml文件中的联系人数据封装成List集合,其中每个元素是实体类Contact。打印输出 List 中的每个元素。
    在这里插入图片描述
    在这里插入图片描述
(2)具体实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>   潘金莲  </name>
        <gender>女</gender>
        <email>123456@qq.com</email>
    </contact>
    <contact id="2" vip="false">
        <name>武松</name>
        <gender>男</gender>
        <email>789123@qq.com</email>
    </contact>
    <contact id="3" vip="false">
        <name>武大郎</name>
        <gender>男</gender>
        <email>147258@qq.com</email>
    </contact>
    <user>
    </user>
</contactList>

/**
 *     <contact id="1" vip="true">
 *     <name>   潘金莲  </name>
 *     <gender>女</gender>
 *     <email>panpan@itcast.cn</email>
 *     </contact>
 */
public class Contact {
    private String name;
    private int id;
    private boolean vip;
    private char gender;

    public Contact() {
    }

    public Contact(String name, int id, boolean vip, char gendar, String email) {
        this.name = name;
        this.id = id;
        this.vip = vip;
        this.gender = gendar;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public boolean isVip() {
        return vip;
    }

    public void setVip(boolean vip) {
        this.vip = vip;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    private String email;

    @Override
    public String toString() {
        return "Contact{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", vip=" + vip +
                ", gender=" + gender +
                ", email='" + email + '\'' +
                '}';
    }
}

public class Dom4JTest {
    @Test
    public void parseTOList() throws Exception {
        // 需求:解析XML中的数据成为一个List集合对象
        // 1.导入dom4j框架(已经完成啦)
        // 2.创建SaxReader对象
        SAXReader saxReader = new SAXReader();
        // 3.加载XML文件成为文档对象Document对象
        Document document = saxReader.read(Dom4JTest.class.getResourceAsStream("/Contacts.xml"));
        // 4.先拿根元素
        Element root = document.getRootElement();
        // 5.提取contact子元素
        List<Element> contactEles = root.elements("contact");
        // 6.准备一个ArrayList集合封装联系人信息
        List<Contact> contacts = new ArrayList<>();
        // 7.遍历Contact子元素
        for (Element contactEle : contactEles) {
            // 8.每个子元素都是一个联系人对象
            Contact contact = new Contact();
            contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
            contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
            contact.setName(contactEle.elementTextTrim("name"));
            contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementTextTrim("email"));
            // 9.把联系人对象数据加入到List集合
            contacts.add(contact);
        }

        // 10.遍历List集合
        for (Contact contact : contacts) {
            System.out.println(contact.toString());
        }
    }
}
(3)Dom4J的解析后的数据形式。

通常数据会封装成Java的对象,如单个对象,或者集合对象形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呦呦呦欸哟哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值