一篇文章搞懂XML中的xmlns,xsi, DTD, XSD,schemaLocation到底啥意思

理解XML中的 xmlns, DTD, XSD, xsi到底什么意思

  用了很久的XML文件了,一直没有好好理解这些东西,今天就借这个机会一举把这些内容搞清楚。力求简练深刻
  本文借鉴了以下的博客:

  1. xml中的xmlns
  2. DTD 与 XSD

1. xmlns

WHY

  xml的标签完全是由用户自定义的, 所以同标签不同意义的情况一定会发生

<table>
<head>
    ...
</head>
<line>
    ...
</line>
</table>

<table>
<chair>
    ...
</chair>
</table>

上例为table 表示表格和桌子。
  而xmlns就是为了避免冲突的发生

HOW

  就像C++,C#,Typescript 之类的编程语言通过引入namespace的概念避免命名冲突一样,XML引入namespace来避免命名空间冲突

<f:table>
    ...
</f:table>
<h:table>
    ...
</h:table>

C++中的命名空间用::来表示, Typescript中的命名空间用. 来表示。
  但是单纯在标签前引入一个字符串和一个冒号并没有什么卵用, 因为命名空间也常常被很随意的使用, 并且也容易重名。
  Java中有一个非常好的避免重名的方法, 就是将包名使用一个域名的倒序来表示:com.google.goova;XML也采取了这样的方式, 按照如下的写法:

<f:table xmlns:f="https://w3.org/some-table">
    ...
</f:table>

这种写法将命名空间f和一个url联系在一起, url唯一的标识了这个命名空间,并且为了懒得写命名空间,W3标准还规定,如果xmlns后面啥也不跟, 就代表默认命名空间, 有点类似于Java默认放在default包里一样;这代表该标签及其未带其他命名空间的子标签全部处于默认命名空间中;

2. xsi 和 schemaLocation

WHY

  代码提示是程序员第一生产力;(第二是百度或者谷歌哈哈);用惯了代码提示的程序员是无法接受没有代码提示的编辑器的。
  什么?这和xsi有什么关系?当然有了,xsi是一个特殊的命名空间, 用来告诉每个命名空间对应的XSD文件去哪里找。XSD文件就相当于一个标签的语法标准,有了这个标准,代码编辑器就能在你写XML文件的时候提示你每一个标签有什么结构,也能在你写错的时候给你报错,把问题扼杀在编译期而不是放到运行时去。

HOW

  因为xsi也是一个命名空间, 所以需要为他指定一个全局唯一的uri

<beans xmlns:xsi="http://www.some-site/some-page">
    ...
</beans>

  这个全局唯一的uri就是为了让这个空间唯一而已,并不能让xml解析器找到XSD文件, 所以我们还需要一个方式来告诉XML解析器去哪里找每个命名空间对应的XSD文件:
  毫无疑问,我们需要一个键值对来进行这个工作,而这个键值对(组)就放在xsi:schemaLocation里

<beans xmlns="https://default-name-space.com/" xmlns:xsi="http://www.some-site/some-page"
    xsi:schemaLocation = "https://default-name-space.com/ https://the-real-site/the-real-page-of-xsd-file"
>
    ...
</beans>

  beans标签的命名空间是https://default-name-space.com, 然后这个命名空间下的beans标签的XSD文件就到https://default-name-space.com/ https://the-real-site/the-real-page-of-xsd-file这个页面去找就行了

3. DTD 和 XSD

  除了XSD文件以外, DTD文件也可以用来表示一个标签应该怎么样写, 这部分的内容这篇文章写的其实比较清楚了, mybatis的xml就是用的DTD的方式来规范的。

4. 题外话

  JSON文件也有类似的schema文件来描述他的规范, 这种方式真实可以极大的减少错误的可能呢;

5. 总结

  命名空间是为了防止标签名冲突, xsi是一种特殊的命名空间, 通过xsi:schemaLocation指定的键值对可以说明每一个命名空间的XSD文件去哪里找,XSD文件描述了一个标签应该怎么样去写;

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值