【转载】xmlns是什么——XML Namespace Explained

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

[html]view plaincopy

print?

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

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"

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

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

先是从StackOverFlow看到:http://stackoverflow.com/questions/1181888/what-does-xmlns-in-xml-mean

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

[html]view plaincopy

print?

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

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

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

[html]view plaincopy

print?

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

在文档中,你可以看到这样的元素。

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

这样写是等价的。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是和前缀联系在一起的,每个元素用到的前缀表示着这个元素属于哪个命名空间。例如:

[html]view plaincopy

print?

rdf:description

xsl:template

zblsa:data

这些例子中:

* 冒号前面部分是前缀

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

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

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

我如何是用命名空间?

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

[html]view plaincopy

print?

.

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

定义一个命名空间前缀

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

[html]view plaincopy

print?

An example document

a simple document

Another element

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

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

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

[objc]view plaincopy

print?

An example document

a simple document

Another element

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

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

[html]view plaincopy

print?

A really bad idea

A really bad idea

Hello World

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

多个命名空间

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

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

[html]view plaincopy

print?

xmlns:bar="http://me.com/namespaces/foobar"

>

An example document

a simple document

Another element

默认的命名空间

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

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

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

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

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

[html]view plaincopy

print?

举例:

[html]view plaincopy

print?

xmlns:bar="http://me.com/namespaces/foobar"

>

An example document

a simple document

Another element

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

再回到问题:

[html]view plaincopy

print?

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

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"

再结合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讲得还是对的:

[html]view plaincopy

print?

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

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

[html]view plaincopy

print?

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

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

[html]view plaincopy

print?

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文档的话,只能引入一个。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容