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。

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

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"

再结合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 文档的结构。

问题解决。

时间: 2024-09-28 22:12:27

xmlns是什么——XML Namespace Explained的相关文章

XML Namespace (xmlns) 属性

http://www.w3school.com.cn/xml/xml_namespaces.asp XML Namespace (xmlns) 属性 XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法: xmlns:namespace-prefix="namespaceURI" 当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联. 注释:用于标示命名空间的地址不会被解析器用于查找信息.其惟一的作用是赋予命名空间一个惟一的名称.不过,很

解决 weblogic poi3.9 报错 a different type with name &quot;javax/xml/namespace/QName&quot;

解决 java.lang.LinkageError: loader constraint violation: loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader) previously initiated loading for a different type with name "javax/xml/namespace/QName" weblogic.xml <?xml version

The tag &#39;ChartPlotter&#39; does not exist in XML namespace

本地build的时候每次都是OK的,但是Shelveset到Server上build的时候,总是出错. 果断google/bing了几个建议,无果. 不得不重新仔细的看server上的building log,然后发现, Considered "..\ExternalDrops\DynamicDataDisplay.dll", but it didn't exist. 晕菜,原来这些文件并没有被加入到server上. 查了一下,还有其他的文件也没有被加入,在“Source Contro

XML Namespace 命名空间

根据 Namespaces in XML W3C 推荐标准的定义,XML 命名空间 是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合:该集合通常称作 XML“词汇”. 定义 XML 命名空间的主要动机之一是在使用和重用多个词汇时避免名称冲突.XML 模式用于为 XML 实例创建一个词汇并频繁使用命名空间.因此,正确理解命名空间概念对于从总体上理解 XML 模式和实例验证至关重要. 命名空间在多个方面类似于 Java 中的程序包: Java 中的程序包可以包含许多可重用的类和接口.

resin启动报错:guava-15.0.jar!/META-INF/beans.xml:5: &lt;beans xmlns=&quot;http://xmlns.jcp.org/xml/ns/javaee&quot;&gt; is an unexpected top-level tag. 异常

项目完成,经过本地的测试,最后在部署的时候,发现服务器resin启动失败,报错信息如下: 从报错信息上看,应该是guava.jar有问题. 排查问题 查看项目引入的guava.jar,信息如下: boneco.jar引入了子包guava-15.0.jar,cache-client.jar引入了guava-18.0.jar. 所以不难明白,guava-15.0.jar肯定不能兼容guava-18.0.jar!但是guava-18.0.jar肯定兼容guava-15.0.jar,所以需要保证项目中引

关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation

https://yq.aliyun.com/articles/40353 ************************************* 摘要: 相信很多人和我一样,在编写Spring或者Maven或者其他需要用到XML文档的程序时,通常都是将这些XML文档头拷贝过来,并没有理解其中元素 (比如xmlns,xmlns:xsi,xsi:schemaLocation)的真正含义,不知道哪些元素是多余的,也不知道为什么要加那些元素.这样 当有时候网... 相 信很多人和我一样,在编写Spr

XML文档中的xmlns、xmlns:xsi和xsi:schemaLocation

文章转载自:https://yq.aliyun.com/articles/40353 相信很多人和我一样,在编写Spring或者Maven或者其他需要用到XML文档的程序时,通常都是将这些XML文档头拷贝过来,并没有理解其中元素(比如xmlns,xmlns:xsi,xsi:schemaLocation)的真正含义,不知道哪些元素是多余的,也不知道为什么要加那些元素.这样当有时候网上Copy的XML头有错的时候自己却不知道怎么下手.我也是这样的,于是今天花了点时间好好的理解了一下这些元素及其用法,

xmlns:android的作用

xmlns:android是一个XML命名空间,告诉Android开发工具你准备使用Android命名空间里的一些通用属性.在所有Android XML设计文件中最外层的标记必须使用这个树形. 它可以提示你输入什么,不该输入什么,什么是对的,什么是错的,也可以理解为语法文件.或者语法判断器什么的. xmlns:android="http://schemas.android.com/apk/res/android 声明xml命名空间.xmlns意思为“xml namespace”.冒号后面是给这个

xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; 是什么意思?

声明xml命名空间.xmlns意思为“xml namespace”.冒号后面是给这个引用起的别名.schemas是xml文档的两种约束文件其中的一种,规定了xml中有哪些元素(标签).元素有哪些属性及各元素的关系,当然从面向对象的角度理解schemas文件可以认为它是被约束的xml文档的“类”或称为“模板”.