我们经常会在网页中碰到形如<html xmlns=”http://www.w3.org/2001/xhtml”>这样的代码,

或在是android 编码中的main.xml中看到形如<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

那后面的xmlns是表示什么意思呢?

官方概念:xmlns是xml namespace的缩写,也就是XML命名空间,xmlns 属性可以在文档中定义一个或多个可供选择的命名空间。该属性可以放置在文档内任何元素的开始标签中。该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属性所在元素内的所有内容。

用来标识命名空间的网络地址并不被XML解析器调用,XML解析器不需要从这个网络地址中查找信息,该网络地址的作用仅仅是给命名空间一个唯一的名字,因此这个网络地址也可以是虚拟的。

最近继续看Struts,在看struts.xml配置的时候看到这个:

  1.  
    xmlns="http://java.sun.com/xml/ns/j2ee"
  2.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

想起了自己在以前的博客中有人问到这个问题,然后自己对XML也比较陌生,所以系统性地学了一下,把基本的属性,XML DOM(其实和HTML DOM类似),DTD,XML Schema,xmlns理了一次。

类似这种技术知识的,直接谷歌就好,这样会省很多时间。

先是从StackOverFlow看到:http://stackoverflow.com/questions/1181888/what-does-xmlns-in-xml-mean(转载自该网站,希望大家支持原作者,我只是一只大自然的搬运工)

问:我在xml文件中看到这句话,xmlns,这是什么呢?

xmlns:android="http://schemas.android.com/apk/res/android"

答:它定义了一个XML命名空间。

在你的例子中,命名空间前缀是android,命名空间的uri为

http://schemas.android.com/apk/res/android

在文档中,你可以看到<android:foo>这样的元素。

这样认为,命名空间前缀就是一个变量,以简短的名字表示整个命名空间uri。

<http://schemas.android.com/apk/res/android:foo />这样写是等价的。XML解析器读取的时候就是这样读取的。

转载自:http://www.sitepoint.com/xml-namespaces-explained/#(希望大家支持原作者,我只是一只大自然的搬运工)

参考的文章写得比较好,w3c在这部分讲得过于简单,所以还是翻译一下这篇文章。

XML Namespaces Explained

为什么我们需要XML命名空间?

这里有存在命名空间的两个基本需要:

1、消除两个刚好同名的元素的歧义。

2、将共同idea的元素分组在一起。

这些描述有点模糊,直接看例子:

消除两个刚好同名的元素的歧义

考虑一下:

* 在(x)html文件中有table元素,同时XSL-FO(现在称为XSL,作用可以类比CSS对Html的作用)里面也有同名的元素。

* a,title和style都是(x)html和SVG(SVG 是使用 XML 来描述二维图形和绘图程序的语言)的元素。

好了,那你怎么区分SVG的title和HTML的title的不同呢?

将共同idea的元素分组在一起

在(X)html文件中,table,style和a元素由所需求的特殊规则管理,一些可能包含,一些可能不包含。

定义所需的规则都应该包括在同一个地方。

例如,我以XML为基础的数据要有验证规则,我要的是:

* 在同一个地方定义这些规则。

* 将这些特殊的规则和其他我(或者是别人)定义的规则集合区分。

命名空间是什么?

命名空间是唯一的URI。

这种格式的好处是任何传输XML的人,可以假装成是拿到了域名(the bit after the http://, but before the next / 这句不知道怎么翻译,希望有人指出,谢谢),但是依靠别人的域名并不好(特别是他们不知道你这样做)。

在XML文档里面,URI是和前缀联系在一起的,每个元素用到的前缀表示着这个元素属于哪个命名空间。例如:

  1.  
    rdf:description
  2.  
     
  3.  
    xsl:template
  4.  
     
  5.  
    zblsa:data

这些例子中:

* 冒号前面部分是前缀

* 冒号后面部分是本地部分

* 任何有前缀的元素是符合规范的名字

* 没有前缀的元素是不符合规范的名字

我如何是用命名空间?

使用命名空间,首先将命名空间和URI联系。

<foo:tag xmlns:foo="http://me.com/namespaces/foofoo">.

foo定义为元素标签命名空间的前缀。xmlns作为前缀和该属性连接,就像在命令“将这些字母和URI连接”。如一个不规范的文档有两个完全一样的属性,冒号后面部分能够阻止相同的前缀同时被定义两次。

定义一个命名空间前缀

这里有个定义一个命名空间前缀的例子:

  1.  
    <foo:tag xmlns:foo="http://me.com/namespaces/foofoo">
  2.  
     
  3.  
     
  4.  
     
  5.  
    <foo:head>
  6.  
     
  7.  
    <foo:title>An example document</foo:title>
  8.  
     
  9.  
    </foo:head>
  10.  
     
  11.  
     
  12.  
     
  13.  
    <foo:body>
  14.  
     
  15.  
    <foo:e1>a simple document</foo:e1>
  16.  
     
  17.  
    <foo:e2>
  18.  
     
  19.  
    Another element
  20.  
     
  21.  
    </foo:e2>
  22.  
     
  23.  
    </foo:body>
  24.  
     
  25.  
    </foo:tag>

所有的元素都在<foo:tag>里面,命名空间前缀foo是和http://me.com/namespaces/foofoo联系在一起的。

在同一命名空间定义多个前缀

不同的前缀代表不同的命名空间是可以的,如下:

  1.  
    <tag>
  2.  
     
  3.  
     
  4.  
     
  5.  
    <foo:head xmlns:foo="http://me.com/namespaces/foofoo">
  6.  
     
  7.  
    <foo:title>An example document</foo:title>
  8.  
     
  9.  
    </foo:head>
  10.  
     
  11.  
     
  12.  
     
  13.  
    <bar:body xmlns:bar="http://me.com/namespaces/foofoo">
  14.  
     
  15.  
    <bar:e1>a simple document</bar:e1>
  16.  
     
  17.  
    <bar:e2>
  18.  
     
  19.  
    Another element
  20.  
     
  21.  
    </bar:e2>
  22.  
     
  23.  
    </bar:body>
  24.  
     
  25.  
    <tag>

不同的命名空间定义相同的前缀

不同的命名空间定义相同的前缀也是可以的(不过不推荐),取决于上下文:

  1.  
    <myns:html xmlns:myns="http://www.w3c.org/1999/xhtml">
  2.  
     
  3.  
     
  4.  
     
  5.  
    <myns:head>
  6.  
     
  7.  
    <myns:title>A really bad idea</myns:title>
  8.  
     
  9.  
    </myns:head>
  10.  
     
  11.  
     
  12.  
     
  13.  
    <myns:body>
  14.  
     
  15.  
    <myns:h1>A really bad idea</myns:h1>
  16.  
     
  17.  
    <myns:pre>
  18.  
     
  19.  
    <myns:pre xmlns:myns="http://my.com/namespaces/test-data">
  20.  
     
  21.  
    <myns:table>
  22.  
     
  23.  
    <myns:data>
  24.  
     
  25.  
    Hello World
  26.  
     
  27.  
    </myns:data>
  28.  
     
  29.  
    </myns:table>
  30.  
     
  31.  
    </myns:pre>
  32.  
     
  33.  
    </myns:pre>
  34.  
     
  35.  
    </myns:body>

笔记:这不是一个好想法!

多个命名空间

如果你使用多个命名空间,那你无疑需要在同时使用多个命名空间——所以你该如何在同一时间声明多个命名空间。

你需要做的就是使用多个xmlns声明,就像这样:

  1.  
    <foo:tag xmlns:foo="http://me.com/namespaces/foofoo"
  2.  
     
  3.  
    xmlns:bar="http://me.com/namespaces/foobar"
  4.  
     
  5.  
    >
  6.  
     
  7.  
     
  8.  
     
  9.  
    <foo:head>
  10.  
     
  11.  
    <foo:title>An example document</foo:title>
  12.  
     
  13.  
    </foo:head>
  14.  
     
  15.  
     
  16.  
     
  17.  
    <bar:body>
  18.  
     
  19.  
    <bar:e1>a simple document</bar:e1>
  20.  
     
  21.  
    <bar:e2>
  22.  
     
  23.  
    Another element
  24.  
     
  25.  
    </bar:e2>
  26.  
     
  27.  
    </bar:body>
  28.  
     
  29.  
    </foo:tag>

默认的命名空间

Q:使用任何命名空间时,所有元素都需要存在一个命名空间里面吗。

A:是的,但是这样不会有问题。

定义一个命名空间但是没有和前缀联系是允许的——在上面的例子中他们是不规范的名字。

这就是xhtml的重要性,作为这种语言的一种需求,xhtml不会取代html——html也不认识前缀们。

定义默认的命名空间,不用前缀,直接将xmlns分配就可以了:

<span style="font-size:18px;"><xhtml xmlns="http://www.w3c.org/1999/xhtml"> </span>

举例:

  1.  
    <html xmlns="http://www.w3c.org/1999/xhtml"
  2.  
     
  3.  
    xmlns:bar="http://me.com/namespaces/foobar"
  4.  
     
  5.  
    >
  6.  
     
  7.  
     
  8.  
     
  9.  
    <head>
  10.  
     
  11.  
    <title>An example document</title>
  12.  
     
  13.  
    </head>
  14.  
     
  15.  
     
  16.  
     
  17.  
    <body>
  18.  
     
  19.  
    <bar:e1>a simple document</bar:e1>
  20.  
     
  21.  
    <bar:e2>
  22.  
     
  23.  
    Another element
  24.  
     
  25.  
    </bar:e2>
  26.  
     
  27.  
    </body>
  28.  
     
  29.  
    </html>

属性和命名空间和我应该在命名空间URI最后放什么就不翻译了。

再回到问题:

  1.  
    xmlns="http://java.sun.com/xml/ns/j2ee"
  2.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.  
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

再结合W3C的教程:

XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

而DTD是,DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

归根到底,命名空间的出现就是为了区分相同名字的元素他们有不同的含义。

通过命名空间就能区分究竟是你的还是我的元素:

xmlns:you= http://you 和 xmlns:me=http://me 这两个不同的命名空间前缀。

如果是xmlns=uri,表示的是文档默认的命名空间。

现在来看,W3C讲得还是对的:

xmlns="http://java.sun.com/xml/ns/j2ee"

告诉schema认证器,XML中所有元素的命名空间都是http://java.sun.com/xml/ns/j2ee

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi为前缀的命名空间。结合上面的例子,xsi:schemaLocation就是http://www.w3.org/2001/XMLSchema-instance/xsi:schemaLocation。

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

发现没有,有两个值,第一个为命名空间的值,第二个值为该命名空间使用的xml schema的位置,而由上面可知道:XML Schema 描述 XML 文档的结构。

最后这个schema后面看书又补充了一些完整的内容进去。

引入xml schema 文档
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
名称空间的不同可以有两种同名但不同的约束模式存在,
第一句并不能声明schema所在的位置,只知道这是名称空间的uri。
schemaLocation在公认的名称空间中声明,所以,前缀用到的时候,要加前缀xsi,同时声明xsi对应的名称空间。
schemaLocation属性设置有两个部分,名称空间 空格 加上schema文件所在的位置。
不使用名称空间引入schema文档的话,只能引入一个。

问题解决。

转载自https://blog.csdn.net/iaiti/article/details/42263891(希望大家能支持原作者,我只是一个大自然的搬运工)

xmlns详解(转载)的更多相关文章

  1. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  2. jQuery的deferred对象详解(转载)

    本文转载自: jQuery的deferred对象详解(转载)

  3. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  4. GridView内容详解(转载)

    GridView内容详解(转载) GridView是ASP.NET界面开发中的一个重要的控件,对GridView使用的熟练程度直接影响软件开发的进度及功能的实现.(车延禄)GridView的主要新特性 ...

  5. 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)

    如约而至,Java 10 正式发布!   3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...

  6. Linux下的I/O复用与epoll详解(转载)

    Linux下的I/O复用与epoll详解 转载自:https://www.cnblogs.com/lojunren/p/3856290.html  前言 I/O多路复用有很多种实现.在linux上,2 ...

  7. C#中的 特性 详解(转载)

    本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...

  8. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  9. Oracle外部表详解(转载)

    (外部表创建主要注意创建目录访问权限问题.目录路径格式无空格等不相关字符,即必须是当前表访问用户可以访问:关于表中行数的限制问题,如果不加限制注意添加reject limit unlimited:表中 ...

  10. 转载+++++iptables详解+++++转载

    转载:http://blog.chinaunix.net/uid-26495963-id-3279216.html 一.前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件 ...

随机推荐

  1. PAT甲级——1072 Gas Station

    A gas station has to be built at such a location that the minimum distance between the station and a ...

  2. docker中使用源码方式搭建SRS流媒体服务

    一.背景 搭建流媒体服务的方式一般会采用nginx+rtmp和srs服务两种,前者是nginx加上插件所用,而后者是专门为了为了流媒体而生,在这一节中我们将从头搭建srs流媒体服务 二. 运行环境 为 ...

  3. MFC ,List使用

    出自http://www.cnblogs.com/yuehui/archive/2012/06/15/2550449.html List容器双向线性表list容器   list类定义了双向的线性表.V ...

  4. csp-s模拟测试51(b)attack,tree题解

    题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...

  5. HZOI20190820模拟27题解

    A. 小奇挖矿2 显然的O(m)dp:$f[i]=max(f[i-4],f[i-7])+a[i]$,当然你要保证i,i-4,i-7都能到达 #include<iostream> #incl ...

  6. php连接数据库插入数据

    <form action="updata.php" method="post"> 姓名:<input type="text" ...

  7. 【DM642学习笔记十】DSP优化记录

    1. 处理的数据先EDMA到片内,具有更高的效率! 以YUV2RGB为例: #pragma DATA_SECTION(onchipBuf0_y,".INTPROCBUFF"); # ...

  8. Webpack构建前端项目

    前言 公司据说要搞前后端分离,趁这两天项目完成的差不多,抓紧时间学习一下前端知识 现在流行前端项目工程化,那么第一个问题就是如何创建工程(项目),第一次玩webpack 通过 NPM 创建项目 # 创 ...

  9. Python-Jsonpath简单入门

    原文来自:http://goessner.net/articles/JsonPath/   JSONPath - 是xpath在json的应用. xml最大的优点就有大量的工具可以分析,转换,和选择性 ...

  10. 构建支持中文字体的moviepy镜像

    首先是系统的环境问题. linux 安装 moviepy需要很多依赖,安装起来费神费力.配置起来也非常麻烦,最简单的办法是直接使用他人构建好的镜像文件. 再就是字体显示问题. 镜像中的imagmagi ...