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

三十.特殊文件

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;
    }
}
  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蔚一

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

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

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

打赏作者

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

抵扣说明:

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

余额充值