XMl概述

xml是可扩展的标记语言。它的标签都是自定义的,然后通过程序员写代码自己进行解析。

html的标签是预定义好的,每一个标签都有特定含义,这些标签可以被浏览器直接识别。

xml一般用来作为配置文件使用,它可以表示具有层次结构的数据。

xml标签的规则

1.标签都有由一对尖括号组成的
2.标签一般都是成对出现的,开始标签和结束标签的名称是一样的
	<student></student>
3.标签可以是单独的一个标签,必须要有结束标签
	<student/>
4.标签可以写属性,由属性名和属性值组成
	<student name="zhagnsan" ></student>
5.标签可以嵌套,不能交叉
	<student>
		<name>zhagnsan</name>
		<age>20</age>
    </student>

xml文件的格式

1.xml文件的头部
	<?xml version="1.0" encoding="UTF-8" ?>
2.一个xml文件有且只有一个根标签
3.类似于<>的特殊字符,需要用特殊符号代替
	< < 小于 
    > > 大于 
    & & 和号 
    ' ' 单引号 
    " " 引号 
4.CDATA区:把需要显示的数据用CDATA区来表示,就不会当做xml的标签进行解析
	<![CDATA[内容]]> // 用的得不多
<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student id="1">
        <name>张三</name>
        <age>18</age>
    </student>

    <student id="2">
        <name>李四</name>
        <age>20</age>
    </student>
</students>

dom4j解析

xml文件其实就是一种具有特殊格式的文本文件,使用专门的类去读取xml文件的过程就叫做xml解析。很多第三方提供的工具类可以很方便的读取xml文件。Dom4j就是一个比较常用的。

SAXReader: Dom4j工具包提供的一个读取xml文件的解析器
Document: 整个xml文件
Element: 表示每一个标签 <标签>标签体</标签>
			getText();才能获取标签体

Attribute: 标签的属性 <标签 属性名="属性值"></标签>
			【属性名="属性值"】表示Attribute对象
			getValue()方法才能获取属性值

使用dom4j解析xml文件的步骤

1.导入dom4j.jar文件
	1)在模块下面新建一个libs文件夹
	2)把dom4j.jar文件,复制到libs文件夹下
	3)选中dom4j.jar右键Add As Library

2.使用dom4j解析xml文件 (查看dom4j提供的文档,来写代码)
	public class XmlParse {
        public static void main(String[] args) throws DocumentException {
            SAXReader reader = new SAXReader();
            Document document = reader.read(new File("day17\\xml\\students.xml"));

            //获取根标签 <students>
            Element rootElement = document.getRootElement();
            //获取根标签下面的子标签 <student>
            List<Element> list = rootElement.elements("student");
			
            List<Student> students=new ArrayList<>();
            for (Element element : list) {
                //获取<student>的id属性的值
                String id = element.attribute("id").getValue();
                //获取<student>的子标签<name>
                String name = element.element("name").getText();
                //获取<student>的子标签<age>
                String age = element.element("age").getText();
				//把获取到的id、name和age封装尾Student对象
                Student stu=new Student(id,name,Integer.parseInt(age));
                //把Student对象添加到集合
                students.add(stu);
            }
			
            for (Student student : students) {
                System.out.println(student);
            } 
        }
    }

DTD约束

约束是用来限定xml的标签可以写那些内容

<!ELEMENT students (student)+>
<!ELEMENT student (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM 'students.dtd' >
<students>
    <student>
        <name>张三</name>
        <age>18</age>
    </student>

    <student>
        <name>李四</name>
        <age>20</age>
    </student>

</students>

Schema约束

Schema是用来约束xml的一种约束文件,用来规定xml可以写哪些标签,标签中可以写哪些属性等。

Schema本身也是一个xml格式的文件。

  • 新建schema文件students.xsd
<!--xml的文档标记-->
<?xml version="1.0"?>
<!--固定写法,表示Schema受到w3c的约束-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
<!--目标的命名空间,schmea文件作用在哪个xml文件中,可以通过命名空间来指定-->
targetNamespace="http://www.itheima.com"
xmlns="http://www.w3school.com.cn"
<!--表示schema是一个完整的文件-->   
elementFormDefault="qualified"> 
<!--表示根元素-->
<xs:element name="students">
	<!--表示元素是一个复杂元素-->
    <xs:complexType>
       <xs:element name="student">
       	 <!--表示元素是一个复杂元素-->
         <xs:complexType>
         	 <!--表示元素是有顺序-->
         	 <xs:sequence>
         	 	<!--表示子元素name,数据类型是strings-->
                <xs:element name="name" type="xs:string"/>
                <!--表示子元素age,数据类型是strings-->
                <xs:element name="age" type="xs:string"/>
      		</xs:sequence>
         </xs:complexType>
       </xs:element>
    </xs:complexType>
</xs:element>
</xs:schema>
  • 引入schema文件
<?xml version="1.0"?>
<students
xmlns="http://www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itheima.com students.xsd">
    <student>
        <name>张三</name>
        <age>18</age>
    </student>
    <student>
        <name>李四</name>
        <age>20</age>
    </student>
</students>