xml中xsd、xsi、xmlns的含义

       XML是可扩展标记语言,它定义了按格式编码文件的一系列规则[3],编码的文件是机器可读和人可读的。XML文件对于机器可读是基于XSD(XML Schema Definition)[1]的。XSD是受W3C推荐的XML文件的结构描述文件的规范文档,其中详细说明了如何正式描述XML文件中的元素[3];也就是说,XSD是XML文件的结构描述文件(比如.xsd文件,一个XSD的实例,它是依照XSD的规范来书写的)的规范文档。编译xml的方式是跨语言的,不同语言的解析方式相同,只是具有不同的语言形式。java中解析XML的方式之一是DOM解析,他是基于jdk的lang包中DocumentBuilderFactory类的,如下所示[2]

复制代码
public class DOMTest {
    public static void main(String[] args) {
        //创建一个DocumentBuilderFactory的对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //创建一个DocumentBuilder的对象
        try {
            //创建DocumentBuilder对象
            DocumentBuilder db = dbf.newDocumentBuilder();
            //通过DocumentBuilder对象的parser方法加载books.xml文件到当前项目下
            Document document = db.parse("books.xml");
            //获取所有book节点的集合
            NodeList bookList = document.getElementsByTagName("book");
            //通过nodelist的getLength()方法可以获取bookList的长度
            System.out.println("一共有" + bookList.getLength() + "本书");
        }
    }
}
复制代码

  那么xml中xsd、xsi、xmlns的含义是什么呢。我以Maven工具的pom.xml文件为例进行说明。Maven的pom.xml文件头信息如下:
       <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                    
                    http://maven.apache.org/xsd/maven-4.0.0.xsd">
  其中,xmlns的值是默认的命名空间;一个xml里可能有多个命名空间,不同的命名空间可对应不同的.xsd约束;
              xmlns:xsi中xsi表示命名空间“http://www.w3.org/2001/XMLSchema-instance”的简写[3]
              xsi:schemaLocation的值为要引入的文档规范实例(比如.xsd文件);

  我刚开始接触XML时,对.xsd和XSD的区别比较困惑。既然有了.xsd,为什么还要XSD,这个我后面会说。说到超文本标记语言,html是我们最常用的超文本标记语言。html和xml的重要区别是,在xml中可以自定义标签。html和xml的区别如下图:

  在xml中XSD和.xsd的含义不同。XSD是由W3C发布的;而.xsd是XML的使用者依据XSD规范定义的XML格式的说明文档,在定义.xsd的同时,还要定义依据XSD对.xsd中指定标签的解析。比如,MAVEN工具定义了http://maven.apache.org/xsd/maven-4.0.0.xsd,并依据XSD对.xsd中指定标签进行解析。.xsd文件与XML是类与对象,数据库表结构和记录的关系。.xsd文件可以看成一个或多个XML文件的模板,在这里可以定义XML文件的元素、元素的属性、元素的排列方式、元素包含的内容等[4]

  为了更好的说明.xsd文件和命名空间的对应关系,可以在地址栏打开http://maven.apache.org/xsd/maven-4.0.0.xsd",它包含如下头信息:

        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                            xmlns="http://maven.apache.org/POM/4.0.0" 
                            elementFormDefault="qualified" 
                            targetNamespace="http://maven.apache.org/POM/4.0.0">
  targetNamespace表示该.xsd只对该目标命名空间生效。

  在一个xml文件中可以定义多个命名空间,比如在springmvc-servlet.xml文件中,它的文件头信息如下:

       <beans xmlns="http://www.springframework.org/schema/beans"
                   xmlns:mvc="http://www.springframework.org/schema/mvc"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:context="http://www.springframework.org/schema/context"
                 xsi:schemaLocation="
                         http://www.springframework.org/schema/beans
                         http://www.springframework.org/schema/beans/spring-beans.xsd
                         http://www.springframework.org/schema/mvc
                         http://www.springframework.org/schema/mvc/spring-mvc.xsd
                         http://www.springframework.org/schema/context
                         http://www.springframework.org/schema/context/spring-context.xsd">
     springmvc-servlet.xml的每个命名空间对应不同的xsd约束文件。如下图,以命名空间为前缀的标签/属性受该命名空间对应的xsd文件约束。

   XSD是XML Schema语言中的一支。它受到DTDs和其它早期XML Schema(比如DDML,SOX,XML-Data和XDR)的影响。XSD采取了一些他们的特点,但同时也是他们之间的妥协。

  相比于DTD,XSD最显著的特点是命名空间和数据类型的支持,在XSD中元素属性值可以为整形或日期类型,而不仅仅是二进制文本。[3]

参考资料:

  [1] XML Schema Part 1 : Structures Second Edition

  [2] XML解析-java中XML解析的4种方式

  [3] XML Schema(W3C)

  [4] 文档类型定义(DTD)

作者:jann8

出处:https://www.cnblogs.com/jann8/p/13022536.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   风吹草  阅读(3939)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode
选择主题