我们经常会在网页中碰到形如<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. 引用不了XXservice,怎么办?

    1.tEdasArchiveLogService = (TEdasArchiveLogService) SpringContextHolder.getBean("TEdasArchiveLo ...

  2. HTML编码的用户输入------阻止向Controller的方法传入参数时用链接注入javascript代码或者HTML标记

  3. Exit- Linux必学的60个命令

    1.作用 exit命令的作用是退出系统,它的使用权限是所有用户. 2.格式 exit 3.参数 exit命令没有参数,运行后退出系统进入登录界面.

  4. sql草稿

    参考:MySQL 内连接.外连接.左连接.右连接.全连接 SELECT count(*) FROM `t_product_base` select m_name from t_medicinal_in ...

  5. 出现 cannot download, $GOPATH not set. For more details see: go help gopath

    执行安装 sudo go get github.com/nsf/gocode 提示: cannot download, $GOPATH not set. For more details see: g ...

  6. Lucene 评分机制一

    1. 评分公式 1.1 公式介绍 这个公式是Lucene实际计算时使用的公式,是由原型公式推导而来 tf(t in d) 表示某个term的出现频率,定义了term t出现在当前document d的 ...

  7. combobox 的onLoadSuccess执行两次解决办法和 取值赋值

    加红色字部分 jsp <input class="easyui-combobox" id="keshi" name="keshi" v ...

  8. 适配器模式(Adapter\Adaptee)

    将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. (1)目标(Target)——客户所期待得到的接口,目标可以是具体的或抽象的类,也可以是接 ...

  9. UVA11722 Jonining with Friend

    Joining with Friend You are going from Dhaka to Chittagong by train and you came to know one of your ...

  10. Codeforces 142D(博弈)

    要点 不难发现问题转化成:n堆石子,每次最多选k堆最少选1堆然后拿走一个石子,谁先没子可拿谁败.本题中撤退不必考虑. 就是记笔记吧,类似nim的博弈,举例:\[k=3,n=4\]\[4堆石子分别是1. ...