Java特殊文件xml—利用Dom4J解析xml文件(完整详解,附有代码+案例)

news2024/11/9 2:16:06

文章目录

  • 三十.特殊文件
    • 30.1 xml概述
    • 30.1 xml文件
    • 30.2 Dom4J解析xml
      • 30.2.1 案列1
      • 30.2.2 案例2

三十.特殊文件

30.1 xml概述

可扩展标记语言

可扩展:标签名字可以自己定义

优点:易于阅读,可以配置成组出现的数据

缺点:解析比较复杂

作用:

  • 用于进行存储数据和传输数据
  • 作为软件的配置文件

作为配置文件的优势:

  • 可读性好
  • 可维护性高

30.1 xml文件

可扩展标记语言

注意点:

  • 属性值用双引号包裹

  • 一个元素可以有多个属性

  • 属性值中不能直接包含<、“、&不建议使用的字符:‘、>

  • 所有XML元素都必须有结束标签

  • XML标签对大小写敏感

  • XML必须正确的嵌套

  • 同级标签以缩进对齐

  • 元素名称可以包含字母、数字或其他的字符

  • 元素名称不能以数字或者标点符号开始

  • 元素名称中不能含空格

  • CDATA数据区域内容随便写

如下 xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有且 定格写 -->
<!--  根标签只能有一个 -->
<users>
    <user id="1" desc="第一个用户">
        <name>张三</name>
        <sex></sex>
        <地址>南京路</地址>
        <password>8888</password>
        <data> 3 &lt; 2 &amp;&amp; 5 > 4 </data>
        <data1>
            <![CDATA[
                3 < 2 && 5 > 4
            ]]>
        </data1>
    </user>
    <people>路人A</people>
    <people>路人B</people>
    <user id="2">
        <name>李四</name>
        <sex></sex>
        <地址>上海路</地址>
        <password>6666</password>
        <data> 3 &lt; 2 &amp;&amp; 5 > 4 </data>
        <data1>
            <![CDATA[
                3 < 2 && 5 > 4
            ]]>
        </data1>
    </user>
</users>

<?xml version="1.0" encoding="UTF-8" ?>
<persons>

    <person id = "1">
        <name>zhangsan</name>
        <age>18</age>
    </person>

    <person id = "2">
        <name>lisi</name>
        <age>19</age>
    </person>
  
    <name>zhaoliu</name>

</persons>

30.2 Dom4J解析xml

Dom4J解析xml需要自己提前部署号Dom4J框架,即导Dom4j包

解析思想:

在这里插入图片描述

通过SAXReader解析器把xml文件解析成Document文档对象。

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

Element:表示标签

Attribute:表示属性

Text :表示文本

Element/Attribute/Text 有共同的父类:Node(节点)

30.2.1 案列1

//解析helloworld.xml文件,文件在30.1中
public class Test01 {
    public static void main(String[] args) throws DocumentException {

        // 创建一个Dom4J框架提供的解析器对象
        SAXReader saxReader = new SAXReader();
     //2.使用saxReader对象把需要解析的XML文件读成一个Document对象。
        Document document = saxReader.read(
      "code_java02\filedemo\helloworld.xml");

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

        // 获取根元素下的全部一级子元素。
        List<Element> elements1 = root.elements();
        for (Element element : elements1) {
            System.out.println(element.getName());
            // user people user
        }
        // 获取根元素下的全部一级子元素user。

        List<Element> elements2 = root.elements("user");
        for (Element element : elements2) {
           System.out.println(element.getName());//user user
        }

        // 获取当前元素下的某个子元素的数据
        // //如果下面有很多子元素people,默认获取第一个。
        Element people = root.element("people");
        System.out.println(people.getText());//路人A

        // 获取元素的属性信息
        Element user = root.element("user");
        System.out.println(user.attributeValue("id"));//1
        // Attribute id = user.attribute("id");

        // 获取属性对象
        Attribute id = user.attribute("id");
        System.out.println(id.getName());//id
        System.out.println(id.getValue());// 1
        System.out.println(id.getText());// 1

        // 获取全部元素的属性信息
        List<Attribute> attributes = user.attributes();
        for (Attribute attribute : attributes) {
            System.out.println(attribute.getName()+
                               "="+attribute.getValue());
          //id=1  desc=第一个用户
        }
        

        // 如何获取全部的文本内容:获取当前元素下的子元素文本值
        System.out.println(user.elementText("name"));//张三
        System.out.println(user.elementText("地址"));//南京路
        System.out.println(user.elementText("password"));
         //8888

        // 获取user下的data文本值
        Element data = user.element("data");
        System.out.println(data.getText());
        //  3 < 2 && 5 > 4

        //取出左右空格
        System.out.println(data.getTextTrim());
       //3 < 2 && 5 > 4

    }
}
//Person.xml文件在30.1中

//标准JavaBean类
public class Peoson {
    private String id;
    private String name;
    private int age;

    public Peoson(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
  
      ...
     
    @Override
    public String toString() {
        return "Peoson{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
=====================================================
  public class PesonTest {
    public static void main(String[] args) throws DocumentException {
				
        ArrayList<Peoson> list = new ArrayList<>();

        // 创建解析器对象
        SAXReader sr = new SAXReader();
        // 利用解析读取xml文件,并返回文档对象
    File file = new File("code_java02\filedemo\person.xml");
        Document document = sr.read(file);
        // System.out.println(document);

        // 获取根元素对象
        Element rootElement = document.getRootElement();
        System.out.println(rootElement.getName());//persons

        // 获取根标签下的全部一级子标签
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            //System.out.println(element.getName());
            //person person

            // 获取属性
            Attribute id = element.attribute("id");
            // 获取属性值
            String idValue = id.getText();

            // 获取标签name
            Element name = element.element("name");
            // 获取标签name文本值
            String nameValue = name.getText();

            // 获取标签age
            Element age = element.element("age");
            // 获取标签age文本值
            String ageValue = age.getText();
            // 因为Person类中的age是int型,所引需要类型转换 
            int ageInt = Integer.parseInt(ageValue);
           //System.out.println(idValue+","+nameValue+","+ageValue);

            // 把Person对象添加到集合中
            Peoson p = new Peoson(idValue,nameValue,ageInt);
            list.add(p);
        }
        // 打印集合
        System.out.println(list);
        // Stream流打印
        list.stream().forEach(s-> System.out.println(s));

    }
}

30.2.2 案例2

解析xml中数据,并将数据添加到对象中,然后把对象添加到集合中,根据对象的用户名和密码判断登录是否成功

<?xml version="1.0" encoding="UTF-8" ?>
<persons>

    <person id = "1">
        <name>zhangsan</name>
        <age>18</age>
    </person>

    <person id = "2">
        <name>lisi</name>
        <age>19</age>
    </person>

</persons>
public class User {
    private String id;
    private String userName;
    private String password;
    private String personId;
    private String phoneId;
    private boolean admin;

    public User() {}

    public User(String id, String userName, String password, String personId, String phoneId, boolean admin) {
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.personId = personId;
        this.phoneId = phoneId;
        this.admin = admin;
    }

    public String getId() { return id;}

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

    public String getPassword() {return password;}

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUserName() {return userName;}

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPersonId() {return personId;}

    public void setPersonId(String personId) {
        this.personId = personId;
    }

    public String getPhoneId() {return phoneId;}

    public void setPhoneId(String phoneId) {
        this.phoneId = phoneId;
    }

   public boolean isAdmin() {return admin;}

   public void setAdmin(boolean admin) {this.admin = admin;}

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", personId='" + personId + '\'' +
                ", phoneId='" + phoneId + '\'' +
                ", admin=" + admin +
                '}';
    }
}
==========================================
  public class UserTest {
    public static void main(String[] args) throws DocumentException {

        // 创建集合,存放User对象
        ArrayList<User> list = new ArrayList<>();

        // 创建解析器对象
        SAXReader sr = new SAXReader();
        // 创建File对象
        File file = new File(
       "code_java02\\src\\xmlproperties\\test03\\user.xml");
        // 利用解析读取xml文件,去获得文档对象
        Document document = sr.read(file);

        // 获得根元素
        Element rootElement = document.getRootElement();

        // 获得根元素下的全部一级子元素
        List<Element> elements = rootElement.elements();

        for (Element element : elements) {
            // element:表示每一个根元素的下的一级子元素

            // 获取user标签的属性id
            Attribute id = element.attribute("id");
            // 获取属性id的文本值
            String idText = id.getText();

            // 获取用户名标签以及标签文本值
            Element username = element.element("username");
            String usernameText = username.getText();

            // 获取密码标签以及文本值
            Element password = element.element("password");
            String passwordText = password.getText();

            // 获取personId
            Element personId = element.element("personId");
            String personIdText = personId.getText();

            // 获取phoneId
            Element phoneId = element.element("phoneId");
            String phoneIdText = phoneId.getText();

            // 获取权限,是否为管理员
            Element admin = element.element("admin");
            String adminText = admin.getText();
            boolean b = Boolean.parseBoolean(adminText);

            // 创建对象,并将从xml中获得的数据赋值给对象
            User user = new User(
              idText,usernameText,passwordText,
              personIdText,phoneIdText,b);

            // 将对象添加到集合中
            list.add(user);
        }

        System.out.println(list);
        System.out.println("请输入用户名:");
        Scanner sc = new Scanner(System.in);
        String userName = sc.nextLine();
        System.out.println("请输入用户密码:");
        String userPassword = sc.nextLine();

        int index = getIndex(list, userName);
        if (index>=0){
            User user = list.get(index);
            if(user.getPassword().equals(userPassword)){
                System.out.println("登录成功!");
            }
        }else {
            System.out.println("用户不存在!");
        }


    }
    // 定义方法,查询username在集合中的索引
    public static int getIndex(ArrayList<User> list,String userName){
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if(user.getUserName().equals(userName)){
                return i;
            }
        }
        return -1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

对称矩阵的压缩存储

1.给自己出题&#xff1a;自己动手创造&#xff0c;画一个5行5列的对称矩阵 2.画图&#xff1a;按“行优先”压缩存储上述矩阵&#xff0c;画出一维数组的样子 3.简答&#xff1a;写出元素 i,j 与 数组下标之间的对应关系 4.画图&#xff1a;按“列优先”压缩存储上述矩阵&a…

盐湖卤水中提取铷、铯

盐湖卤水中提取铷、铯是一个复杂但具有重要意义的过程&#xff0c;因为铷、铯是稀有的金属元素&#xff0c;在高科技、航空航天、新能源等领域有广泛应用。以下是从盐湖卤水中提取铷、铯的详细分析&#xff1a;我国盐湖资源丰富&#xff0c;盐类资源总量约12000亿吨&#xff0c…

2024.9.12(k8s环境搭建2)

一、接9.11 19、部署calico的pod 4. 查看容器和节点状态 异常处理&#xff1a; 出现Init:0/3&#xff0c;查看node节点 /var/log/messages是否有除网络异常之外的报错信息 三台机器执行&#xff1a;&#xff08;更新版本&#xff09; yum list kernel yum update kernel reb…

i++与++i在for循环中效果一样?

首先说结果 是的&#xff0c;在Visual Studio 2022中&#xff0c;不同于直接printf&#xff0c;在for循环中的i与i是同样的效果&#xff08;都当作了i&#xff09; 这是编译器干的好事。 如图比对 i i 原因探寻 | i i的底层原理 找到一篇博客&#xff0c;我目前还看不太明…

关于Spring Cloud 表达式注入漏洞——分析复现

更多漏洞分析复现&#xff0c;可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/5175.html 一、漏洞成因 近期&#xff0c;Spring Cloud官方发布了一则安全公告&#xff0c;修复了一个Spring Cloud Function中的 SPEL表达式注入漏洞。该漏洞是由于Spring Clou…

123.rk3399 uboot(2017.09) 源码分析3(2024-09-12)

啃了几天initf_dm,发现啃不动啊&#xff0c;但是后面的函数比这个简单&#xff0c;要不先把简单的做了吧。 本文接上一篇https://blog.csdn.net/zhaozhi0810/article/details/142050827 一、c的入口 board_init_f 1.3.12 arch_cpu_init_dm&#xff08;common/board_f.c&#…

AWS账号申请指南:必须绑定银行卡吗?

小伙伴们&#xff0c;大家好&#xff01;今天九河云来和大家聊一聊一个常见的问题&#xff1a;申请AWS账号时&#xff0c;是否必须要绑定银行卡呢&#xff1f;相信很多小伙伴在注册AWS账号时都会遇到这个问题。为了帮助大家更好地了解这个过程&#xff0c;小编特意整理了一些信…

SprinBoot+Vue旅游景点管理系统设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

模 板

导引&#xff1a; 模板是为了解决函数类型不同所重载&#xff0c;带来的麻烦简化。利用一个模板&#xff08;示列&#xff09;代码&#xff0c;让编译器编写出不同类型的代码&#xff0c;满足所需。 int swap(int &p1,int &p2) {int pp1;p1p2;p2p; } char swap(char …

优化安防视频监控的关键体验:视频质量诊断技术如何应用在监控系统中?

随着科技的不断进步&#xff0c;视频监控平台在公安、司法、教育、基础设施等众多领域得到了广泛应用。然而&#xff0c;视频图像的质量直接关系到监控系统的应用效果&#xff0c;是反映监控系统运维效果的重要指标之一。因此&#xff0c;视频监控平台需要配备一系列先进的视频…

基于剂型改良的复杂注射剂分析!

改良型新药在医药领域的重要性日益凸显&#xff0c;其中脂质体注射剂作为一类重要的改良型新药&#xff0c;因其独特的临床优势和技术创新&#xff0c;正受到行业的高度关注。本文基于药融咨询团队的深度分析报告&#xff0c;探讨脂质体注射剂的技术创新、市场前景以及在中国的…

动手学深度学习(三)深度学习计算

一、模型构造 1、继承Module类来构造模型来构造模型 class MLP(nn.Module):# 声明带有模型参数的层&#xff0c;这里声明了两个全连接层def __init__(self, **kwargs):# 调用MLP父类Block的构造函数来进行必要的初始化。这样在构造实例时还可以指定其他函数# 参数&#xff0c…

利用CubeMX复现正点原子TFTLCD驱动例程

来源&#xff1a;正点原子 FMC的工作原理暂时先欠着&#xff0c;先记录一下CRUD的过程。 第一步准备一个us级别延时函数&#xff0c;不会的参考拙作&#xff1a;STM32的定时器简介-CSDN博客 第二部开启FMC外设&#xff1a; ①进入 Pinout->FMC 配置栏&#xff0c;配置 …

【隐私计算】Paillier半同态加密算法

一、何为同态加密&#xff08;HE&#xff09;&#xff1f; HE是一种特殊的加密方法&#xff0c;它允许直接对加密数据执行计算&#xff0c;如加法和乘法&#xff0c;而计算过程不会泄露原文的任何信息。计算的结果仍然是加密的&#xff0c;拥有密钥的用户对处理过的密文数据进…

树莓派5开发板-安装Raspberry Pi系统-学习记录1

树莓派5开发板介绍 树莓派5&#xff08;Raspberry Pi 5&#xff09;是树莓派系列最新的开发板&#xff0c;相较于前几代产品&#xff0c;它在性能、连接性和功能方面都有了显著提升。以下是树莓派5的一些主要特点&#xff1a; 处理器&#xff1a;树莓派5搭载了Broadcom BCM27…

如何基于gpt模型抢先打造成功的产品

来自&#xff1a;Python大数据分析 费弗里 ChatGPT、gpt3.5以及gpt4&#xff0c;已然成为当下现代社会中几乎人尽皆知的话题&#xff0c;而当此种现象级产品引爆全网&#xff0c;极大程度上吸引大众注意力的同时&#xff0c;有一些嗅觉灵敏的人及时抓住了机会&#xff0c;通过快…

【FreeRL】我的深度学习库构建思想

文章目录 前言参考python环境效果已复现结果 综述DQN.py&#xff08;主要&#xff09;算法实现参数修改细节实现显示训练&#xff0c;保存训练 Buffer.pyevaluate.pylearning_curves 前言 代码实现在:https://github.com/wild-firefox/FreeRL 欢迎star 参考 动手学强化学习e…

Coggle数据科学 | 小白学 RAG:Milvus 介绍与使用教程

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;小白学 RAG&#xff1a;Milvus 介绍与使用教程 什么是Milvus&#xff1f; Milvus 是一款高性能、高扩展性的开源向量数据库&#xff0c;专为处理…

【阿一网络安全】如何让你的密码更安全?(三) - 散列函数

散列函数 散列函数&#xff08;Hash Function&#xff0c;又称散列算法、哈希函数&#xff09;&#xff0c;是一种从任何一种数据中创建小的数字指纹的方法。 散列值 散列函数&#xff0c;把任意长的消息明文&#xff0c;压缩成摘要&#xff0c;使得数据量变小&#xff0c;将…

[数据集][目标检测]脊椎检测数据集VOC+YOLO格式1137张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1137 标注数量(xml文件个数)&#xff1a;1137 标注数量(txt文件个数)&#xff1a;1137 标注…