DTD && Schema

Posted zhangsonglin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DTD && Schema相关的知识,希望对你有一定的参考价值。

XML约束简介

XML文档都是自定义标签,所以编写起来比较随意自由。
所以我们要给XML文档创建一个规则,我们需要在遵守相应的规则的前提下来编写XML文档。
XML约束共有两种形式:
1.DTD
2.Schema

DTD

    > 文档类型定义
> DTD可以定义文档中可以出现哪些元素、哪些属性、哪些内容、哪些实体。
> 如何使用:
    - 在XML文档内部使用
        可以在文档中通过<!DOCTYPE student []>设置内部的DTD约束
        语法 <!DOCTYPE 根元素 [定义元素的规则]>

        如果将DTD约束的信息编写到文档内部,那么该约束只能约束当前文档,而不能复用,
        所以一般情况我们不使用内部的DTD约束,而是通过引入外部DTD约束的形式来使用。

    - 在XML文档外部设置DTD约束
        - 当我们引入一个外部的DTD约束,我们的IDE可以为xml文档弹出提示代码
        -第一种方式:引入系统内部的DTD约束文件:
            <!DOCTYPE student SYSTEM "stu.dtd">
            语法:
            <!DOCTYPE 根元素 SYSTEM "约束文件的地址">

        -第二种:引入一个公共的DTD约束文件:
            - 公共的DTD一般是放到互联网中共大家使用
            <!DOCTYPE student PUBLIC "//www.atguigu.com//xmlDTD//stu" "stu.dtd">
            语法:
            <!DOCTYPE 根元素 PUBLIC "唯一标识" "url地址">
                - url地址执向是一个dtd文件

命名空间

    > namespace 命名空间 也叫 名称空间
> 同一个XML文档可能出现同名的标签,这时我们就可以通过使用前缀的方式来加以区分。
> 为元素增加前缀的目的就是要确保XML文档中的标签唯一。
> 简单的a b c d 不能确保前缀唯一,所以通常的方式使用url地址,但是url地址太长了,编写起来不方便
> 最终解决方式是为每一个url地址指定简单名字,使用该简单名字作为标签前缀,这个就是XML中命名空间

> 我们可以通过在XML文档的根元素中通过xmlns属性来引入一个命名空间:
    语法 xmlns:前缀 = "URL地址"
> 在同一个XML文档中可以引入多个命名空间,这样就可以确保XML文档中的标签的名字的唯一性。
> 我们还可以在文档中指定一个默认的命名空间,所谓默认的命名空间指的时,如果XML文档中标签没有使用前缀,则会使用默认命名空间。
    语法 xmlns="url地址"
> 注意:一个XML文档中只能有一个默认的命名空间

Schema

  > Schema也是对XML文档进行约束。
    > DTD是一个比较古老的技术,他是SGML过来的,所以语法比较难。
    > DTD的语法并不是采用XML的语法,而是一种新的语法
    > DTD不能定义太复杂的内容,比如:我想指定某一个元素的属性只能是一个int类型。
    > DTD不支持命名空间
- Schema他是使用XML语法开发约束文件,他可以定义复杂XML语法规则,所以现在比较主流XML都是用Schema。
- Schema的约束文件的扩展名是xsd
- 格式:
    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://www.example.org/book"
            xmlns:tns="http://www.example.org/book" 
            elementFormDefault="qualified">

    </schema>

    xmlns="http://www.w3.org/2001/XMLSchema"
        - 引入schema文档的默认命名空间
    targetNamespace="http://www.example.org/book"
        - 指当前文档要为哪个命名空间下的元素定义规则
    xmlns:tns="http://www.example.org/book" 
        - 定义当前targetNamespace指向的命名空间,可以通过别名在文档中使用命名空间,这个属性不是必须的,一般不设置
    elementFormDefault="qualified"
        - 文档中的标签是否必须在schema文档中进行定义
        - qualified的意思是文档中使用的标签必须要在schema中定义过

- 在XML文档中引入schema约束
    <book
        xmlns="http://www.atguigu.com/book"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.atguigu.com/book book.xsd"
    >
        <title>aaaaa</title>

    </book>

    schema约束都是在跟标签中引入:
        xmlns="http://www.atguigu.com/book" 
        - 指定当前文档的默认命名空间,这个命名空间需要和schema文件中的targetNamespace一致

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        - 引入w3c对schema的约束

        xsi:schemaLocation="http://www.atguigu.com/book book.xsd"
        - 通过schemaLocation来管理xsd文件
            格式:
            xsi:schemaLocation="命名空间 xsd文件的路径"

以上是关于DTD && Schema的主要内容,如果未能解决你的问题,请参考以下文章

xml元素类型PCDATA和CDATA的区别(DTD中)

DOM&JavaScript示例&练习

利用xxe获取linux系统的passwd

web安全XML&XXE安全&外部实体&利用

mybatis配eclise模板

TestNG 默认禁用从不安全的 Url 加载 DTD