美文网首页
详解 xml 文件头部的 xmlns:xsi

详解 xml 文件头部的 xmlns:xsi

作者: zhangyin | 来源:发表于2020-08-06 13:55 被阅读0次

    原文在此,写的比较通俗易懂,特转发一下,向原作者致敬~
    https://blog.csdn.net/lengxiao1993/article/details/77914155

    XSD(XML Schema Definition)

    一套Xml中元素的定义规范;

    xmlns (xml name space)

    指定xml文档中元素所隶属的命名空间;

    xsi xml schema instance

    一个XSD的实例,就好比new了一个object 出来;

    xsi:schemaLocation

    上面这行的语法其实是, xsi:schemaLocation = "键" “值”,用来说明XSD的命名空间和定义文件;

    举个栗子

    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    

    初学者看到如上的内容应当有如下困惑点:

    • xmlns:xsi , xmlns, xsi:schmeLocation 这些看上去相近的属性是什么含义, 为什么他们的值是不一样的 URL

    • 这些 URL 是否对应一些可以访问的资源,对于该文件的解析是否会需要下载这些 URL 对应的资源

    从 xmlns 的作用讲起

    一个 xml 文档中如果包含如下两种定义不同, 但是名称相同的元素, xml 解析器是无法解析的, 因为它不能确定当你调用 document.getElementsByTagName("book") 时应该返回哪个元素。

    <!-- 这里的 table 元素描述的是一个表格-->
    <table>
       <tr>
       <td>Apples</td>
       <td>Bananas</td>
       </tr>
    </table>
    <!-- 这里的 table 元素描述的是一个家居桌子-->
    <table>
       <name>African Coffee Table</name>
       <width>80</width>
       <length>120</length>
    </table>
    

    显然, 如果给他们的名字添加一个前缀, 则命名冲突的问题就可以解决。

    <!-- 这里的 table 元素描述的是一个表格-->
    <h:table>  <!--添加了前缀 h -->
       <h:tr>
       <h:td>Apples</h:td>
       <h:td>Bananas</h:td>
       </h:tr>
    </h:table>
    <!-- 这里的 table 元素描述的是一个表格-->
    <f:table> <!--添加了前缀 f -->
       <f:name>African Coffee Table</f:name>
       <f:width>80</f:width>
       <f:length>120</f:length>
    </f:table>
    

    但是, 在一个拥有众多元素的文档中, 仅仅拥有前缀, 也不能完全避免命名冲突的问题。

    • 注意 xml 文档相互之间是可以通过 XInclude, External Entites 实现相互包含或者引用的。

    此时, 命名空间就诞生了, 我们可以为元素定义一个命名空间, 将一个很长的, 可以保证全局唯一性的字符串与该元素关联起来。这样就可以避免命名冲突了。

    但是如何保证那个较长的字符串全局唯一呢, 最好的方式莫过于使用 统一资源标识符(Uniform Resource Identifier,URI) 了, 而我们最常见的 URI 就是平时经常访问的网址 URL 了。

    xmlns:namespace-prefix="namespaceURI"
    

    应用到我们所举的例子中就是:

    <!-- 这里的 table 元素描述的是一个表格-->
    <h:table xmlns:h="http://www.w3.org/TR/html4/">
       <h:tr>
       <h:td>Apples</h:td>
       <h:td>Bananas</h:td>
       </h:tr>
    </h:table>
    <!-- 这里的 table 元素描述的是一个表格-->
    <f:table xmlns:f="http://www.w3school.com.cn/furniture">
       <f:name>African Coffee Table</f:name>
       <f:width>80</f:width>
       <f:length>120</f:length>
    </f:table>
    
    • 所以, 对于命名空间的标识符, URI 的作用仅仅是保证唯一性, 它并不需要对应一个可以访问的资源或文件 ! 但是, 有很多公司都会让 namespace 的 URI 指向一个包含该命名空间信息的网页

    回到我们的 POM 文档头中,你会发现 project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 中的http://www.w3.org/2001/XMLSchema-instance可以访问到一个正常的页面, 但是如果访问 xmlns="http://maven.apache.org/POM/4.0.0" 中的 http://maven.apache.org/POM/4.0.0 就会得到一个 PAGE NOT FOUND 错误, 页面未获取到。

    xmlns 出现在没有前缀的元素中的含义

    <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    

    细心的童鞋会注意到, project 元素前面并没有前缀。 这里实际上使用的是默认命名空间(default naming space)。 它的语法如下:

    <elementName xmlns="namespaceURI">
    

    例如我们的 project 元素定义 和下面的例子

    <table xmlns="http://www.w3.org/TR/html4/">
      <tr>
        <td>Apples</td>
        <td>Bananas</td>
      </tr>
    </table>
    

    使用默认命名空间的作用是, 该元素内部的子元素都会默认属于该命名空间下, 我们不需要为他们一一添加命名空间前缀。

    xmlns:xsi 与 xsi:schemaLocation

    现在来看文件头中剩下的, 看上去更为复杂的部分。

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    

    根据之前的知识我们可以理解, xmlns:xsi 定义了一个命名空间前缀 xsi 对应的唯一字符串 http://www.w3.org/2001/XMLSchema-instance。 但是读者会发现, 这个 xmlns:xsi 在不同的 xml 文档中似乎都会出现。 这是因为, xsi 已经成为了一个业界默认的用于 XSD((XML Schema Definition) 文件的命名空间。 而 XSD 文件(也常常称为 Schema 文件)是用来定义 xml 文档结构的。

    • 注解: XML 解析器可以根据 一个 XSD 文件的内容来解析另一个 XML 文件, 判断该文件的结构是否和 XSD 文件中定义的一致。 XSD 文件 可以理解为 XML 文档可以自定义的语法或格式检查器。

    那么, 有了上述的理解, 再来看

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
    

    上面这行的语法其实是, xsi:schemaLocation = "键" “值”
    即 xsi 命名空间下 schemaLocation 元素的值为一个由空格分开的键值对。

    • 前一个“键” http://maven.apache.org/POM/4.0.0 指代 【命名空间】, 只是一个全局唯一字符串而已

    • 后一个值指代 【XSD location URI】 , 这个值指示了前一个命名空间所对应的 XSD 文件的位置, xml parser 可以利用这个信息获取到 XSD 文件, 从而通过 XSD 文件对
      所有属于 命名空间 http://maven.apache.org/POM/4.0.0 的元素结构进行校验, 因此这个值必然是可以访问的, 且访问到的内容是一个 XSD 文件的内容

    相关文章

      网友评论

          本文标题:详解 xml 文件头部的 xmlns:xsi

          本文链接:https://www.haomeiwen.com/subject/gayzrktx.html