xml(标签,解析,约束)

学习xml网址:www.w3school.com.cn

1.xml概述

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种很像HTML的标记语言
  • XML 的设计宗旨是传输数据,而不是显示数据,也可以储存数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准
  • XML作为软件的配置文件

Xml用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。Xml是标准通用标记语言(SGML)的子集,非常适合Web传输。XML提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。 

2.xml标签规则

3.xml语法规则

 

在xml中,一些字符拥有特殊的意义。如果把字符“<”放在xml元素中,会发生错误,这是因为解析器会把它当作新元素的开始,这样会产生xml错误

 或

 注释:<!-- 注释的内容 -->

        XML注释,以<!--开头,以-->结尾
        注释不能嵌套
        idea 上的快捷键是CTRL + /

4.解析xml

解析器:就是根据不同的解析方式提供具体实现,有的解析器过去繁琐,为了方便开发人人员,会有提供易于操作的解析开发包Dom4j:比较简单的解析开发包(日常开发包中用的次数最多的)

DOM解析原理以及结构模型

解析原理:XML DOM 将整个XML文档加载到内存,生成一个DOM树,并且获得一个Document对象通过Document对象就可以对DOM进行操作

 

Document对象(绿):整个xml文档
Element对象(蓝):所有标签
Attribute对象(红):所有属性
Text对象(紫):所有文本内容
出第一个后三个有一个共同的父类为Node对象

Dom4j的基本使用

1.导包
2.把jar导入到模块项目中,比那个添加classpath路径依赖
3.创建解析器对象
4.使用解析器读取xml文档,生成Document对象
5.根据根元素获取下面的子元素/属性...

练习:

 xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!--注释内容-->
<!--本xml文件用来描述多个学生信息-->
<students>
    <!--第一个学生信息-->
    <student id="1">
        <name>张三</name>
        <age>23</age>
    </student>
    
    <student id="2">
    <!--第二个学生信息-->
        <name>李四</name>
        <age>24</age>
    </student>
</students>

学生类:

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;
    }

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类:

//利用dom4j解析xml文件
public class XmlParse {
    public static void main(String[] args) {
        //1.获取一个解析器对象
        SAXReader saxReader=new SAXReader();

        //2.利用解析器把xml文件加载到内存中,并返回一个文档对象
        Document document=saxReader.read(new File("myxml\\xml\\student.xml"));

        //3.获取到根标签
        Element rootElement=document.getRootElement();

        //4.通过根标签来获取student标签
        //elements():可以获取调用者所有的子标签,会把这些子标签放到一个集合中返回
        //elements("标签名"):可以获取调用者所有的子标签,会把这些子标签放到一个集合中并返回
        //List list=rootElement.elements();
        List<Element> studentElements=rootElements("student");
        //System.out.println(list.size());

        //用来装学生对象
        ArrayList<Student> list=new ArrayList<>();

        //5.遍历集合,得到每一个student标签
        for(Element element:studentElements){
            //element异常表示每一个student标签

            //获取id这个属性
            Attribute attribute=element.attribte("id");
            //获取id这个属性值
            String id=attribute.getValue();

            //获取name标签
            //element("标签名"):获取调用者指定的子标签
            Element nameElement=element.element("name");
            //获取这个标签的标签体内容
            String name=nameElement.getTexe();

            Element ageElement=element.element("age");
            //获取age标签的标签体内容
            String age=ageElement.getTexe();

//            System.out.println(id);
//            System.out.println(name);
//            System.out.println(age);

            Student s=new Student(id,name,Integer.parseInt(age));
            list.add(s);
        }

        //遍历操作
        for (Student student : list) {
            System.out.println(student);
        }
    }
}

4.xml约束

1.DTD约束

根据DTD约束正确的书写XML
在XML技术中可以编写一个文档来约束一个XML文档的书写规范,这就称之为XML约束
约束文档定义在XML文件种允许出现的元素/标签名称、属性以及元素出现的顺序等等
有两种约束:【DTD约束,文件后缀.dtd】、【Schema约束,文件后缀.xsd】
【注意】约束文档不需要我们去写,我们只要按照约束文档的要求去写XML就可以了

2. xml文件引入DTD的三种方式

1.引入本地dtd:DTD约束文档在本地,DTD约束文档和XML文档配置文件在同一个目录下

2.在xml文件内部引入:在XML内部嵌入的DTD,只对当前XML有效

3.引入网络dtd:DTD约束文档在网络上

3.DTD语法规则

定义元素:

例:

定义属性: 

 例:

4.DTD约束和schema约束的区别

5.schema约束

Schema和DTD是一样的,也是一种XML文件的约束Schema约束的后缀格式是 .xsd

xml Schema是用一套预先规定的xml元素和属性创建的,这些元素和属性定义了xml文档的结构和内容模式。Xml Shema规定xml文档实例的结构和每个元素/属性的数据类型。

对于Schema来讲,我们可以将shema比喻成为是表结构。在表结构里,定义一些数据的限制要求。然后我们xml文档呢就相当于是数据表将来要存储的数据u,也就是数据库里面的数据表数据了,所以整体来讲的话schema它就是用于验证xml文档的。

编写:

 例:

xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<persons>
    <person>
        <name>张三</name>
        <age>23</age>
    </person>
</persons>

schema约束:

<?xml version="1.0" encoding="UTF-8" ?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.bilibili.cn/jacase"
    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 version="1.0" encoding="UTF-8" ?>
<persons
        xmlns:xsi="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.bilibili.cn/jacase"
        xsi:schemaLpcation="http://www.bilibili.cn/jacase person.xsd"
>

    <person>
        <name>张三</name>
        <age>23</age>
    </person>
</persons>

属性定义:

例:

xml文件:

<?xml version="1.0" encoding="UTF-8" ?>
<persons
        xmlns:xsi="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.bilibili.cn/jacase"
        xsi:schemaLpcation="http://www.bilibili.cn/jacase person.xsd"
>

    <person id="001">
        <name>张三</name>
        <age>23</age>
    </person>
</persons>

约束:

<?xml version="1.0" encoding="UTF-8" ?>
<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.bilibili.cn/jacase"
    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>

                        <attribute name="id" type="string" use="required"></attribute>
                    </complexType>

                </element>
            </sequence>
        </complexType>
    </element>
</schema>