Java_XML文件

 XML:

        xml文件是一种配置文件,用来保存程序在运行时需要的一些参数

三种配置文件:

        .txt文件、.properties文件、.xml文件

优缺点:

TXT文件:

        优点:无

        缺点:不利于阅读

properties文件:

        优点:键值对形式易于阅读,解析简单

        缺点:无法配置一组一组的数据

XML文件:

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

        缺点:解析比较复杂

适用情况:

        数据量较少,一个键只对应一个值,使用properties

        数据量较多,使用xml

XML概述:

        XML全称为(EXtensible Markup Language),是一种可扩展的标记语言(通过标签(元素)描述数据的语言)。

XML作用:

        用户存储数据和传输数据

        作为软件的配置文件

XML的标签(元素)规则:

XML的其他组成:

        关于第一点,注释信息可以采用快捷键Ctrl+/或Ctrl+Shift+/。

        关于第二点,XML文件中这几个符号<>' " &都有其自身含义,所以采用前面那串字符表示对应符号。

        关于第三点,内容部分中,所有符号都可以写,写什么就是什么,不会有歧义

XML文件格式:

        文件后缀必须是xml

        文档声明必须是第一行

        必须存在一个根标签,有且只能有一个

XML文件编写:

文档约束:

        文档约束是用来限定xml文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件

文档约束分类:
1.DTD
约束步骤

DTD编写:

在xml文件中引入DTD:

2.schema

        可以约束具体的数据类型,约束功能更加强大

        它本身也是一个xml文件,本身也受到其他约束文件的要求,所以编写的更加严谨

约束步骤:

schema编写:
<?xml version="1.0" encoding="UTF-8" ?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.itheima.cn/javase"
    elementFormDefault="qualified"
>

    <!--定义persons复杂元素-->
    <element name="persons">
        <complexType>
            <sequence>
                <!--定义person复杂元素-->
                <element name = "person">
                    <complexType>
                        <sequence>
                            <!--定义name和age简单元素-->
                            <element name = "name" type = "string"></element>
                            <element name = "age" type = "string"></element>
                        </sequence>
                        
                    </complexType>
                </element>
            </sequence>
        </complexType>

    </element>

</schema>
在xml文件中引入schema:

        在xml文件第二行写上<根标签名 xmlns="schema文件中的targetNameSpace的网址">

        (当.xsd文件以及在项目中存在,那么在xml文件中写完第一行文档声明,第二行打左括号就会自动弹出提示)

XML文件的解析技术

有SAX和DOM两种,DOM是目前使用较多的

DOM常见的解析工具

        重点是Dom4j下面重点介绍它

Dom4j解析思想

解析练习

        将xml文件中的学生信息全部转变成学生对象封装到集合中并打印

xml文件代码:

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

    <Student id="1">
        <name>han</name>
        <age>21</age>
    </Student>

    <Student id="1">
        <name>zhao</name>
        <age>21</age>
    </Student>

    <Student id="1">
        <name>ma</name>
        <age>22</age>
    </Student>

</Students>
代码演示:
Student类:
public class Student {

    private String id;
    private String name;
    private int age;


    public Student() {
    }

    public Student(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return id
     */
    public String getId() {
        return id;
    }

    /**
     * 设置
     * @param id
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{id = " + id + ", name = " + name + ", age = " + age + "}";
    }
}
测试类:
public class DomDemo1 {
    public static void main(String[] args) throws DocumentException {

        //创建集合存储Student对象
        ArrayList<Student> list = new ArrayList<>();

        //创建解析器对象
        SAXReader saxReader = new SAXReader();
        File file = new File("C:\\Users\\Han\\IdeaProjects\\mylogback\\src\\a.xml");
        //获取xml文件的Document对象
        Document document = saxReader.read(file);

        //获取根标签
        Element rootElement = document.getRootElement();
        System.out.println(rootElement.getName());
        System.out.println("------------------------");

        //获取根标签的子标签
        List<Element> elements1 = rootElement.elements();
        for (Element element : elements1) {
            System.out.println(element.getName());
        }
        System.out.println("------------------------");

        //获取指定的子标签
        List<Element> elements2 = rootElement.elements("Student");
        for (Element element : elements2) {
            System.out.println(element.getName());
        }
        System.out.println("------------------------");

        //继续获取更里面的内容
        for (Element element : elements2) {
            //属性id
            Attribute id = element.attribute("id");
            String idValue = id.getText();
            //标签name
            Element name = element.element("name");
            String nameValue = name.getText();
            //标签age
            Element age = element.element("age");
            int ageValue = Integer.parseInt(age.getText());

            //变成Student对象添加到集合
            list.add(new Student(idValue,nameValue,ageValue));


        }
        //打印集合
        list.stream().forEach(s -> System.out.println(s));

    }
}
运行结果

XML文件的检索技术

        如果需要从XML文件中检索需要的某个信息(如:name),使用Dom4j需要进行文件的全部解析,然后再寻找数据,很麻烦

        而这种情况使用XPath技术则更加适合。

XPath介绍:

        使用路径表达式来定位XML文档中的元素节点或属性节点

使用XPath检索xml文件:

代码演示(绝对路径搜索):
xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<Students>

    <Student id="1">
        <name>han</name>
        <age>21</age>
    </Student>

    <Student id="1">
        <name>zhao</name>
        <age>21</age>
    </Student>

    <Student id="1">
        <name>ma</name>
        <age>22</age>
    </Student>

</Students>
测试类:
public class XPathDemo1 {
    public static void main(String[] args) throws DocumentException {

        SAXReader saxReader = new SAXReader();
        File file = new File("C:\\Users\\Han\\IdeaProjects\\mylogback\\src\\a.xml");
        Document document = saxReader.read(file);

        List<Node> nodes = document.selectNodes("/Students/Student");
        for (Node node : nodes) {
            System.out.println(node);
        }

    }
}
运行结果:

        关于上面代码查找时的表达式,还有以下几种形式

全文搜索:

属性查找:

XPath小结:

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值