XML是可扩展(标签的名字是自定义的)的标记语言
作用:用于进行存储数据和传输数据

作为软件的配置文件

语法

1.标签由一对尖括号和合法标识符组成
2.标签必须成对出现
3.特殊的标签可以不成对, 但是必须有结束标记 <address/>
5.标签中可以定义属性, 属性和用标签空格分开 属性值必须用引号括起来 <student id="1"> </student>
6.标签需要正确的嵌套

    <student id="2">
        <name>张三</name>
    </student>

7.XML文件的后缀名为:xml 文档声明必须是第一行第一列
<?xml version="1.0" encoding="UTF-8" ?>
8.必须存在一个根标签 但有且仅由一个

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="1">
        <name>张三</name>
        <age>23</age>
    </student>

    <student id="2">
        <name>张三</name>
        <age>23</age>
    </student>

</students>

9.XML中可以存在注释信息
10.特殊字符:

<<小于
>>大于
&&和号
''单引号
""双引号

10:CDATA区:不需要被解析的文本数据的部分。CDATA区内的内容被视为纯文本,不会被XML解析器解释为标签或实体引用
<message> <![CDATA[内容icascuc]]> </message>
DOM解析思想:
DOM解析思想

dom4j解析xml文件

1.获取解析器对象
SAXReader reader = new SAXReader();
然后得到Document对象 Document document = reader.read(new File("sample.xml"));
2.解析根标签
Element rootElement = document.getRootElement();
3.通过根标签获取student子标签集合
List<Element> elements = rootElement.elements("student");
如果 elements() 方法不加变量会解析到根标签的所有的子标签
4.得到student子标签的属性和子标签
获取属性标签: Attribute attribute = element.attribute("id");
从属性标签得到属性值: String idValue = attribute.getValue();

子标签: Element nameElement = element.element("name");
从子标签得到标签值: String name = nameElement.getText();

DTD约束

可以用于约束XML文件的结构和内容

1.引入DTD约束
DTD文件内容:

<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

1.引入本地DTD:
<!DOCTYPE persons SYSTEM 'persondtd.dtd'>
2.直接在xml文件内部定义dtd:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons [
        <!ELEMENT persons (person)>
        <!ELEMENT person (name,age)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        ]>
<persons>
    <person>
        <name>张三</name>
        <age>20</age>
    </person>

</persons>

3.引入网络dtd(待更新)
<!DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的URL">

DTD的语法规则

定义一个元素的格式为 <!ELEMENT 元素名 元素类型>

简单元素的元素类型有如下三种:
EMPTY 表示标签体为空
ANY 表示标签体可以为空也可以不为空
PCDATA 表示该元素的内容为字符串
复杂元素的元素类型: 直接写子元素名称
多个子元素可以使用" , "或 |隔开
","表示定义子元素的顺序
"|"表示子元素只能出现任意一个

<!ELEMENT persons (person+)>
子元素后面带加号表示该子元素可以出现一个或多次
"?"表示零次或一次
"*"表示零次或多次
如果什么都不写则代表只出现于一次

<!ATTLIST person id CDATA #FIXED "p1">
定义属性的规则:
<!ATTLIST 标签名称 属性名称 属性的类型 属性的约束>

<!ELEMENT persons (person+)>
<!ELEMENT person (name,age)>
<!ATTLIST person id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>

属性的类型:CDATA类型:普通的字符串
属性的约束:
#REQUIRED :必须的
#IMPLIED :属性不是必须的
#FIXED :属性值是固定的

schema

schema和dtd的区别:
1.schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名是.xsd
2.一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
3.dtd里面元素类型的取值比较单一, 常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
4.schema语法更加的复杂

schema文件的规则

1.创建一个文件,这个文件的后缀名为.xsd
2.定义文档声明
<?xml version="1.0" encoding="UTF-8" ?>
3.在schema根标签中定义属性

<schema
    xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.itheima.cn/javase"
    elementFormDefault="qualified"
>
</schema>

4.通过element定义复杂元素

      <!--定义persons复杂元素-->
    <element name="persons">
        <complexType>
            <sequence>
            <!--定义person复杂元素-->
                <element name="person">
                    <complexType>
                        <sequence>

                            <element name="name" type = "string"></element>
                            <element name="age" type="string"></element>

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


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

引入schema文件

<!--把需要引入的地方的根标签改成这样-->
<persons
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.itheima.cn/javase"  <!--这是自己在schema文件中定义的标签-->
    xsi:schemaLocation="http://www.itheima.cn/javase person.xsd"  
>
</persons>

schema定义属性:
<attribute name="id" type="string" use="required"></attribute>
定义属性的代码写在根标签的子标签的标签外,如下所示

      <!--定义persons复杂元素-->
    <element name="persons">
        <complexType>
            <sequence>
            <!--定义person复杂元素-->
                <element name="person" maxOccurs="unbounded">
                    <complexType>
                        <sequence>

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