xmlns是什么——XML Namespace Explained
最近继续看Struts,在看struts.xml配置的时候看到这个: 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,这是什么呢? xmlns:android="http://schemas.android.com/apk/res/android" 答:它定义了一个XML命名空间。 在你的例子中,命名空间前缀是android,命名空间的uri为 http://schemas.android.com/apk/res/android在文档中,你可以看到<android:foo>这样的元素。 这样认为,命名空间前缀就是一个变量,以简短的名字表示整个命名空间uri。 和
参考的文章写得比较好,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是和前缀联系在一起的,每个元素用到的前缀表示着这个元素属于哪个命名空间。例如: rdf:description xsl:template zblsa:data 这些例子中: * 冒号前面部分是前缀 * 冒号后面部分是本地部分 * 任何有前缀的元素是符合规范的名字 * 没有前缀的元素是不符合规范的名字 我如何是用命名空间? 使用命名空间,首先将命名空间和URI联系。 <foo:tag xmlns:foo="http://me.com/namespaces/foofoo">. foo定义为元素标签命名空间的前缀。xmlns作为前缀和该属性连接,就像在命令“将这些字母和URI连接”。如一个不规范的文档有两个完全一样的属性,冒号后面部分能够阻止相同的前缀同时被定义两次。 定义一个命名空间前缀 这里有个定义一个命名空间前缀的例子: <foo:tag xmlns:foo="http://me.com/namespaces/foofoo"> <foo:head> <foo:title>An example document</foo:title> </foo:head> <foo:body> <foo:e1>a simple document</foo:e1> <foo:e2> Another element </foo:e2> </foo:body> </foo:tag> 所有的元素都在 <foo:tag> 里面,命名空间前缀foo是和http://me.com/namespaces/foofoo 联系在一起的。
在同一命名空间定义多个前缀 不同的前缀代表不同的命名空间是可以的,如下: <tag> <foo:head xmlns:foo="http://me.com/namespaces/foofoo"> <foo:title>An example document</foo:title> </foo:head> <bar:body xmlns:bar="http://me.com/namespaces/foofoo"> <bar:e1>a simple document</bar:e1> <bar:e2> Another element </bar:e2> </bar:body> <tag> 不同的命名空间定义相同的前缀 不同的命名空间定义相同的前缀也是可以的(不过不推荐),取决于上下文: <myns:html xmlns:myns="http://www.w3c.org/1999/xhtml"> <myns:head> <myns:title>A really bad idea</myns:title> </myns:head> <myns:body> <myns:h1>A really bad idea</myns:h1> <myns:pre> <myns:pre xmlns:myns="http://my.com/namespaces/test-data"> <myns:table> <myns:data> Hello World </myns:data> </myns:table> </myns:pre> </myns:pre> </myns:body> 笔记:这不是一个好想法! 多个命名空间 如果你使用多个命名空间,那你无疑需要在同时使用多个命名空间——所以你该如何在同一时间声明多个命名空间。 你需要做的就是使用多个xmlns声明,就像这样: <foo:tag xmlns:foo="http://me.com/namespaces/foofoo" xmlns:bar="http://me.com/namespaces/foobar" > <foo:head> <foo:title>An example document</foo:title> </foo:head> <bar:body> <bar:e1>a simple document</bar:e1> <bar:e2> Another element </bar:e2> </bar:body> </foo:tag> 默认的命名空间 Q:使用任何命名空间时,所有元素都需要存在一个命名空间里面吗。 A:是的,但是这样不会有问题。 定义一个命名空间但是没有和前缀联系是允许的——在上面的例子中他们是不规范的名字。 这就是xhtml的重要性,作为这种语言的一种需求,xhtml不会取代html——html也不认识前缀们。 定义默认的命名空间,不用前缀,直接将xmlns分配就可以了: <span style="font-size:18px;"><xhtml xmlns="http://www.w3c.org/1999/xhtml"> </span> 举例: <html xmlns="http://www.w3c.org/1999/xhtml" xmlns:bar="http://me.com/namespaces/foobar" > <head> <title>An example document</title> </head> <body> <bar:e1>a simple document</bar:e1> <bar:e2> Another element </bar:e2> </body> </html> 属性和命名空间和我应该在命名空间URI最后放什么就不翻译了。 再回到问题: 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 Schema 是基于 XML 的 DTD 替代者。 而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 文档 问题解决。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |