您的位置:首页 > 其它

xml中的xmlns和schemaLocation的理解

2018-04-02 21:48 393 查看
在xml中,经常会遇到xmlns,schemaLocation这样的名词,到底是什么意思呢?我通过查询各种资料,有了一个初步的了解。
XML Schema  是用来描述 XML 文档的结构。
先定义一个schame的文档结构
<?xml version="1.0" encoding="UTF-8" ?>

<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.atguigu.com/bookSchema"
    elementFormDefault="qualified">
    <element name="书架">          <!-- 元素  -->
        <complexType>                    <!-- 复杂类型  -->
            <sequence maxOccurs="unbounded">  <!-- 序列   没有最大数 -->
                <element name="书">
                    <complexType>
                        <sequence>
                            <element name="书名" type="string" />
                            <element name="作者" type="string" />
                            <element name="售价" type="string" />
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>

    </element>
</schema>
下面是符合上面schema的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.atguigu.com/bookSchema"
    xmlns:dd="http://www.w3.org/2001/XMLSchema-instance"
    dd:schemaLocation="http://www.atguigu.com/bookSchema book.xsd">
    <书>
        <书名>JavaScript开发</书名>
        <作者>老佟</作者>
        <售价>28.00元</售价>
    </书>
</书架>

此处的schema文件和xml文件在同一个文件夹,schame的名称为 book.xsd。
xml文件需要上面的schema文件进行定义。xml就需要引用上面的schema。如何引用呢,首先schema得有一个标识,然后在xml中引入这个标识即可。
在schema文件中有这样的一句话:targetNamespace="http://www.atguigu.com/bookSchema",这里的targetNamespace就相当于一个标识,也可以理解为id。标识这个schema的唯一性,在xml的xmlns中引入这个值即可
再看xml中的引用:有这样的一句话 xmlns="http://www.atguigu.com/bookSchema"。这句话就表示要引用一个 targetNamespace为http://www.atguigu.com/bookSchema的schema到当前的xml中。但光有schema的唯一标识还不够,还需要知道这个schema文件的位置。所以在xml中就会有这样的一句代码

schemaLocation="http://www.atguigu.com/bookSchema book.xsd"  这个代码的标准格式为
schemaLocation = “namespace  path”      (namepace即schema的id,path即schema的路径,中间用空格隔开) 如果多个的情况下为 schemaLocation = “namespace  path  namespace  path  namespace  path”

这句代码锁代表的含义是   targetNamespace为http://www.atguigu.com/bookSchema的schema的文件位置是book.xsd(因为schema和xml文件在同一个路径下,spring配置文件中用的都是网络地址,直接定义到schema文件)

上面的代码中的schemaLocation的前面还有一个前缀,dd:schemaLocation。这个是什么意思呢?
这里需要解释一下,schemaLocation 也是一个元素,也需要一个schema来进行定义。所以在xml中还有一个schema的引用
xmlns ="http://www.w3.org/2001/XMLSchema-instance"  这个schema是用来定义schemaLocation的。
那么这时候,xml中就会有两个命名空间(即schema的标识)

xmlns="http://www.atguigu.com/bookSchema"

xmlns="http://www.w3.org/2001/XMLSchema-instance"
如果这样,那么问题就来了,下面的元素不知道自己是哪个namespace下的。所以这时候就需要一个别名

  xmlns:dd="http://www.w3.org/2001/XMLSchema-instance"  把http://www.w3.org/2001/XMLSchema-instance的schema设置成了别名dd。  dd:schemaLocation 就表示是这个命名空间下的元素。
可能有人会问,http://www.w3.org/2001/XMLSchema-instance这个命名空间不用确定位置的路径么。个人理解,schema是w3c自己研发的,http://www.w3.org/2001/XMLSchema-instance  这个命名空间也是w3c的地址,所以内部可能不用引入(个人理解,错误勿喷。总之schemaLocation的schema不用path对应就是了)
如果把第一个schema也加入别名那么凡是相关的元素都需要加别名,如下:
 <?xml version="1.0" encoding="UTF-8"?>
<aa:书架 xmlns:aa="http://www.atguigu.com/bookSchema"
    xmlns:dd="http://www.w3.org/2001/XMLSchema-instance"
    dd:schemaLocation="http://www.atguigu.com/bookSchema book.xsd">
    <aa:书>
        <aa:书名>JavaScript开发</aa:书名>
        <aa:作者>老佟</aa:作者>
        <aa:售价>28.00元</aa:售价>
    </aa:书>

</aa:书架>
所以 如果引入了N个schema, 至少需要给n-1个取别名。

最后就是schema文件中的schema引用了
schema xmlns="http://www.w3.org/2001/XMLSchema"

schema同样也是xml文件,引入了http://www.w3.org/2001/XMLSchema的定义,同样是引用的w3c的schema,所以未加path(个人理解)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xml  schema