文章目录
- 三十.特殊文件
- 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 < 2 && 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 < 2 && 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;
    }
}



















![[数据集][目标检测]脊椎检测数据集VOC+YOLO格式1137张1类别](https://i-blog.csdnimg.cn/direct/f2e18bc86dfa4fc0aca921bb2be848af.png)