xml的命名空间

xml的命名空间,第1张

XML 命名空间提供避免元素命名冲突的方法。

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

这个 XML 文档携带基春陵着某个表格中的信息:

这个 XML 文档携带有关桌子的信息(一件家具):

假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table>元素,就会发生命名冲突。

XML 解析器无法确定如何处理这类冲突。

此文档带森枣有某个表格中的信息:

此 XML 文档携带着有关一件家具的信息:

现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table>元素 (<h:table>和 <f:table>)。

通过使用前缀,我们创建了两种不同类型的 <table>元素。

这个 XML 文档携带着某个表格中的信息:

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4"><h:table xmlns:h="http://www.w3.org/TR/html4/" >

<h:tr>

<h:td>Apples</h:td>

<h:td>Bananas</h:td>

</h:tr>

</h:table></pre>

此 XML 文档携带着有关一件家具的信息:

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4"><f:table xmlns:f="http://www.w3school.com.cn/furniture" >

<f:name>African Coffee Table</f:name>

<f:width>80</f:width>

<f:length>120</f:length>

</f:table></pre>

与仅仅使用前缀不同,我们为 <table>标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4">xmlns:namespace-prefix="namespaceURI"</pre>

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

请访问 http://www.w3.org/TR/html4/ 。

统一资源标识符 是一串可以标识因特网资源的字符。最常用的 URI 是用来标示因特网域名地址的 统一资源定位器(URL) 。另一个不那么常用的 URI 是 统一资源命名(URN) 。在我们的例子中,我们仅使用 URL。

为元素定义默认的搏戚命名空间可以让我们省去在所有的子元素中使用前缀的工作。

请使用下面的语法:

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4">xmlns="namespaceURI"</pre>

这个 XML 文档携带着某个表格中的信息:

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4"><table xmlns="http://www.w3.org/TR/html4/" >

<tr>

<td>Apples</td>

<td>Bananas</td>

</tr>

</table></pre>

此 XML 文档携带着有关一件家具的信息:

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4"><table xmlns="http://www.w3school.com.cn/furniture" >

<name>African Coffee Table</name>

<width>80</width>

<length>120</length>

</table></pre>

当开始使用 XSL 时,您不久就会看到实际使用中的命名空间。XSL 样式表用于将 XML 文档转换为其他格式,比如 HTML。

如果您仔细观察下面的这个 XSL 文档,就会看到大多数的标签是HTML标签。非 HTML 的标签都有前缀 xsl,并由此命名空间标示:" http://www.w3.org/1999/XSL/Transform ":

<pre style="margin: 15px 0px 0pxpadding: 20pxborder: 1px dotted rgb(119, 136, 85)font-family: Consolaswidth: 765pxbackground: rgb(245, 245, 245)line-height: 1.4"><?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

<xsl:template match="/">

<html>

<body>

<h2>My CD Collection</h2>

<table border="1">

<tr>

<th align="left">Title</th>

<th align="left">Artist</th>

</tr>

<xsl:for-each select="catalog/cd">

<tr>

<td><xsl:value-of select="title"/></td>

<td><xsl:value-of select="artist"/></td>

</tr>

</xsl:for-each>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet></pre>

您好,很高兴为您解答。

XML文档可以创建自定义的元素和属性词汇来描述数据。当XML文档较为复杂或是需要从别的地方取得内容时,一个文档中有可能会需要不止一个词汇,这样就会产生名称相同而含义不同的元素出现在不同词汇中的情况。

例如,如果需要建立一个含有XHTML信息的家具目录:

在这个XML文档中,同样名为<table>的两个元素却有着完全不同的含义。

命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再亮野耐将该前缀应用于XML文档中的元素上:

虽然有一些惯例可以遵循,但这里选择的前缀并不理想。在上个例子中,第一个前缀cat表示的是目录项。你同样可以将之称为dog或catalog。第二个前缀xhtml表示的是文档中的XHTML元素。这是一个符合命名空间惯例的例子。

命名空间使用统一资源定位符(URI)来识别每个词汇。在上面包含XHTML内容的例子中,URI是由W3C控制的,因为它控制着XHTML标准。你敬春也可以将cat前缀置于自己的控制之下。

值得注意的是,URI并不一定需要指向一个实际的文档或目录。对它仅有的要求就是,在XML文档中它必须是唯一的。然而很多处理程序,包括XML模式、XHTML和XSLT处理程序,都使用URI来注明它们必须处理文档的某一部分。因此,对于这些应用程序需要使用正确的URI。

在http://www.w3.org/TR/REC-xml-names/中可以找到W3C关于“XML中的命名空间(Namespaces in XML)”的推荐标准。

2.1.1 在XML文档中加入命名空间

为了引用一个命名空间,可以将其以属性的形式加入任何包含了属于该命名空间中元素的节点中。命名空间经常加在文档元素中,因为它包含了所有其脊氏他的元素。在上面的XML文档中,最开始的元素可改写为如下形式:

这决定了命名空间cat指向URI http://www.apress.com/ns/furniture。命名空间cat可置于任何元素名字前,并以冒号分开:

2.1.2 添加默认命名空间

一个XML文档的大部分通常都属于一个XML词汇。在这种情况下,可以定义一个默认的命名空间,而不是为每个元素重复地添加命名空间前缀。可以使用xmlns关键字来定义默认的命名空间。这样,就不用为默认命名空间内的元素指定前缀了。

例如,可以将catalog指定为默认命名空间:

现在这是默认的命名空间了,因而就不必再在此命名空间内的元素名前加上前缀了。

可以在文档中的任何位置声明默认命名空间。被声明的默认命名空间适用于包含了声明的元素及其所有子元素,而且会覆盖此前所做的声明。

下面的XML文档演示了如何使用多个默认命名空间:

默认的catalog命名空间适用于除了包含于第二个<table>元素内的所有元素。因为加入了命名空间声明,下面元素默认的就是XHTML命名空间:

关于命名空间的最后一点是关于它们使用的属性。默认情况下,属性与它包含的元素属于同一个命名空间中。除非你使用的是不同于其包含元素的其他命名空间中定义的属性,否则就不必进行验证。

在关于如何使用DTD和XML模式定义XML词汇的内容中,将会进一步说明命名空间的重要性。

PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要的意义。

PHP 命名空间可以解决以下两类问题:

用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读野巧性。

默认情况下,所有常量巧世、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。

PHP支持两颂宽键种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11975782.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存