xmlns是什么
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
xmlns是什么
最近继续看Struts,在看struts.xml配置的时候看到这个:
[html]view plaincopy
1.xmlns="/xml/ns/j2ee"
2.xmlns:xsi="/2001/XMLSchema-instance"
3.xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_
4.xsd"
想起了自己在以前的博客中有人问到这个问题,然后自己对XML 也比较陌生,所以系统性地学了一下,把基本的属性,XML DOM (其实和HTML DOM类似),DTD,XML Schema,xmlns理了一次。
类似这种技术知识的,直接谷歌就好,这样会省很多时间。
先是从StackOverFlow看到:
问:我在xml文件中看到这句话,xmlns,这是什么呢?
[html]view plaincopy
1.xmlns:android="/apk/res/android"
答:它定义了一个XML命名空间。
在你的例子中,命名空间前缀是android,命名空间的uri为
[html]view plaincopy
1./apk/res/android
在文档中,你可以看到<android:foo>这样的元素。
这样认为,命名空间前缀就是一个变量,以简短的名字表示整个命名空间uri。
和</apk/res/android:foo />这样写是等价的。
XML解析器读取的时候就是这样读取的。
参考:
参考的文章写得比较好,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
1.rdf:description
2.
3.xsl:template
4.
5.zblsa:data
这些例子中:
* 冒号前面部分是前缀
* 冒号后面部分是本地部分
* 任何有前缀的元素是符合规范的名字
* 没有前缀的元素是不符合规范的名字
我如何是用命名空间?
使用命名空间,首先将命名空间和URI联系。
[html]view plaincopy
1.<foo:tag xmlns:foo="/namespaces/foofoo">.
foo定义为元素标签命名空间的前缀。
xmlns作为前缀和该属性连
接,就像在命令“将这些字母和URI连接”。
如一个不规范的文档有两个完全一样的属性,冒号后面部分能够阻止相同的前缀同时被定义两次。
定义一个命名空间前缀
这里有个定义一个命名空间前缀的例子:
[html]view plaincopy
1.<foo:tag xmlns:foo="/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>
25.</foo:tag>
所有的元素都在<foo:tag>里面,命名空间前缀foo是和/namespaces/foofoo联系在一起的。
在同一命名空间定义多个前缀
不同的前缀代表不同的命名空间是可以的,如下:
[objc]view plaincopy
1.<tag>
2.
3.
4.
5.<foo:head xmlns:foo="/namespaces/foofoo">
6.
7.<foo:title>An example document</foo:title>
8.
9.</foo:head>
10.
11.
12.
13.<bar:body xmlns:bar="/namespaces/foofoo">
14.
15.<bar:e1>a simple document</bar:e1>
16.
17.<bar:e2>
18.
19.Another element
20.
21.</bar:e2>
23.</bar:body>
24.
25.<tag>
不同的命名空间定义相同的前缀
不同的命名空间定义相同的前缀也是可以的(不过不推荐),取决于上下文:
[html]view plaincopy
1.<myns:html xmlns:myns="/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="/namespaces/test-data">
20.
21.<myns:table>
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声明,就像这样:
[html]view plaincopy
1.<foo:tag xmlns:foo="/namespaces/foofoo"
2.
3.xmlns:bar="/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分配就可以了:[html]view plaincopy
1.<span style="font-
size:18px;"><xhtml xmlns="/1999/xhtml"> </span>
举例:
[html]view plaincopy
1.<html xmlns="/1999/xhtml"
2.
3.xmlns:bar="/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最后放什么就不翻译了。
再回到问题:
[html]view plaincopy
1.xmlns="/xml/ns/j2ee"
2.xmlns:xsi="/2001/XMLSchema-instance"
3.xsi:schemaLocation="/xml/ns/j2ee /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
1.xmlns="/xml/ns/j2ee"
告诉schema认证器,XML中所有元素的命名空间都是/xml/ns/j2ee
[html]view plaincopy
1.xmlns:xsi="/2001/XMLSchema-instance"
xsi为前缀的命名空间。
结合上面的例子,xsi:schemaLocation就是/2001/XMLSchema-instance/xsi:schemaLocation。
[html]view plaincopy
1.xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-app_2_4.xsd"
发现没有,有两个值,第一个为命名空间的值,第二个值为该命名空间使用的xml schema的位置,而由上面可知道:XML Schema 描述 XML 文档的结构。
最后这个schema后面看书又补充了一些完整的内容进去。
引入xml schema 文档
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-
app_2_4.xsd"
名称空间的不同可以有两种同名但不同的约束模式存在,
第一句并不能声明schema所在的位置,只知道这是名称空间的uri。
schemaLocation在公认的名称空间中声明,所以,前缀用到的时候,要加前缀xsi,同时声明xsi对应的名称空间。
schemaLocation属性设置有两个部分,名称空间空格加上schema文件所在的位置。
不使用名称空间引入schema文档的话,只能引入一个。
问题解决。