整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

XML 命名空间

XML 命名空间

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

命名冲突

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

这个 XML 携带 HTML 表格的信息:

<table>

<tr>

<td>Apples</td>

<td>Bananas</td>

</tr>

</table>

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

<table>

<name>African Coffee Table</name>

<width>80</width>

<length>120</length>

</table>

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

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

使用前缀来避免命名冲突

在 XML 中的命名冲突可以通过使用名称前缀从而容易地避免。

该 XML 携带某个 HTML 表格和某件家具的信息:

<h:table>

<h:tr>

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

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

</h:tr>

</h:table>

<f:table>

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

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

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

</f:table>

在上面的实例中,不会有冲突,因为两个 <table> 元素有不同的名称。

XML 命名空间 - xmlns 属性

当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。

命名空间是在元素的开始标签的 xmlns 属性中定义的。

命名空间声明的语法如下。xmlns:前缀="URI"。

<root>

<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>

<f:table xmlns:f="http://www.w3cschool.cc/furniture">

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

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

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

</f:table>

</root>

在上面的实例中,<table> 标签的 xmlns 属性定义了 h: 和 f: 前缀的合格命名空间。

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

命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明:

<root xmlns:h="http://www.w3.org/TR/html4/"

xmlns:f="http://www.w3cschool.cc/furniture">

<h:table>

<h:tr>

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

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

</h:tr>

</h:table>

<f:table>

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

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

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

</f:table>

</root>

注释:命名空间 URI 不会被解析器用于查找信息。

其目的是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

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

统一资源标识符(URI,全称 Uniform Resource Identifier)

统一资源标识符(URI)是一串可以标识因特网资源的字符。

最常用的 URI 是用来标识因特网域名地址的统一资源定位器(URL)。另一个不那么常用的 URI 是统一资源命名(URN)。

在我们的实例中,我们仅使用 URL。

默认的命名空间

为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。它的语法如下:

xmlns="namespaceURI"

这个 XML 携带 HTML 表格的信息:

<table xmlns="http://www.w3.org/TR/html4/">

<tr>

<td>Apples</td>

<td>Bananas</td>

</tr>

</table>

这个XML携带有关一件家具的信息:

<table xmlns="http://www.w3schools.com/furniture">

<name>African Coffee Table</name>

<width>80</width>

<length>120</length>

</table>

实际使用中的命名空间

XSLT 是一种用于把 XML 文档转换为其他格式的 XML 语言,比如 HTML。

在下面的 XSLT 文档中,您可以看到,大多数的标签是 HTML 标签。

非 HTML 的标签都有前缀 xsl,并由此命名空间标识:xmlns:xsl="http://www.w3.org/1999/XSL/Transform":

<?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>

如您还有不明白的可以在下面与我留言或是与我探讨QQ群308855039,我们一起飞!

、参考

(1)https://blog.csdn.net/weixin_42565127/article/details/130927438

(2)https://www.runoob.com/csharp/csharp-namespace.html

(3)https://blog.csdn.net/wuqiang20081807/article/details/78470003

1、成员修饰符

public、protected、private对应着类或成员的权限。

internal也是一各类型/成员修饰符(被修饰的类型或者成员称为内部类型或成员),只是它所修饰的类只能在同一个程序集中被访问,而同一个程序集表示同一个dll程序集或同一个exe程序集。

  • Internal:访问仅限于当前程序集。
  • protected internal:访问限制到当前程序集或从包含派生的类型的类别。

2、namespace命名空间的作用

2.1功能

命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。

命名空间可以将不同的程序集(功能)隔离开来。

图片来源https://www.runoob.com/csharp/csharp-namespace.html

2.2命名空间定义

命名空间的定义是以关键字 namespace 开始,后跟命名空间的名称,如下所示:

namespace namespace_name
{
   // 代码声明
}

2.3对不同命名空间程序的调用

为了调用支持命名空间版本的函数或变量,会把命名空间的名称置于前面,如下所示:

namespace_name.item_name;

(1)测试例子

namespace A_space
{
    public class ChenSpaceTestClass1
    {
        public void Run()
        {
            Console.WriteLine("---ChenSpaceAClass1_Run--");

        }
    }
}

namespace B_space
{
    //注意,故意同名了
    public class ChenSpaceTestClass1
    {
        public void Run()
        {
            Console.WriteLine("---ChenSpaceBClass1_Run--");

        }
    }
}

class Demo
{
    public static void Main()
    {
        A_space.ChenSpaceTestClass1 chenSpaceTestClass1_1=new A_space.ChenSpaceTestClass1();
        chenSpaceTestClass1_1.Run();

        B_space.ChenSpaceTestClass1 chenSpaceTestClass1_2=new B_space.ChenSpaceTestClass1();
        chenSpaceTestClass1_2.Run();
    }
}

(2)测试结果

2.4使用using对不同命名空间程序的调用

使用 using 命名空间指令,这样在使用的时候就不用在前面加上命名空间名称。

(1)测试例子如下

using first_space;
using second_space;

namespace first_space
{
    class abc
    {
        public void func()
        {
            Console.WriteLine("Inside first_space");
        }
    }
}
namespace second_space
{
    class efg
    {
        public void func()
        {
            Console.WriteLine("Inside second_space");
        }
    }
}
class TestClass
{
    static void Main()
    {
        abc fc=new abc();
        efg sc=new efg();
        fc.func();
        sc.func();
    }
}

(2)可以看出使用了相应的using后,abc和efg类都可以直接使用了

(3)测试结果

3、程序集

3.1认识误区

参考了https://blog.csdn.net/wuqiang20081807/article/details/78470003

  • internal,英文含义是“内部的”,这时候基础不扎实的同学,可能就混淆了这个“内部的”的确切含义,到底是指“同一命名空间”的内部,还是“同一程序集”的内部,本人就是突然被问到这个问题的时候,真的就犹豫了,而且曾经一度以为就是“同一命名空间”的内部(话外:我们太多时候都自以为了,其实只要自己稍微MSDN查一下,就很清楚了)。
  • 微软MSDN官方的解释这个内部就是“同一程序集”的内部,也就是说,internal修饰的方法或者属性,只要是在同一个程序集的中的其他类都可以访问,如果二者不在同一命名空间,只要使用using引用上相应的命名空间即可,这里,从另外一个方面也间接看出命名空间并不是界定访问级别的,而是保证全局的类唯一性的,下面就从现实生活中解释下internal的实际作用。

3.2程序集

(1)程序集可以理解成一个个不同的DLL

(2)程序集和命名空间不存在必然联系,一个程序集可以包含多个命名空间,同一个命名空间也可以分放在几个程序集。

(3)命名空间是逻辑上的组织单元,而程序集是物理上的组织单元。一个程序集可以包含多个命名空间,而一个命名空间也可以跨越多个程序集。程序集的名称通常包含其命名空间,以便于识别和管理。


4、Internal测试例子

4.1 在同一个程序集内部internal修饰的类可以访问

在vs中一个项目会生成一个dll文件,因此这个dll或这个项目也就是一个程序集。比如下面的一个dll

namespace Common
{
    internal class A
    {
        public void aa()
        {
        }
    }
    public class B
    {
        public void bb()
        {
            //这样是正确的
            A a=new A();
            a.aa();
        }
    }
}

4.2 在另一个程序集内部internal修饰的类不可访问

如果另一个项目TestWeb引用了4.1中的dll,即common.dll,即

using Common;
namespace TestWeb
{
    public class Test
    {
        public void test_1()
        {
            //这样是出错的
            A a=new A();
            a.aa();
 
            //这样是正确的
            B b=new B();
            b.bb();
        }
    }
}

4.3protected internal

一般一个成员或类型只能有一个访问修饰符,但使用protected internal组合时除外,它的访问仅限于从包含类派生的当前程序集或类型。即我们可以在本程序集中访问,也可以在其他程序集中继承访问。如下:

名空间

命名空间(namepace)

主要作用就是减少全局变量,避免变量之间的命名冲突,使全局空间最大化的整洁。

不使用命名空间模式的情况如下

function a(){}

function b(){}

var c=2;

var d=5;

var e={};

e.name="tina";

var f={};

以上有两个全局函数,两个全局对象,两个全局变量,这样无疑是有潜在风险的,比如无意中创建了一个与变量d同名的函数。

typeof d//"number"

function d(){alert(123)};

typeof d;//"function"变量d的数据类型和值被改变了。

这样的结果虽然可能是无意的,但却是很糟糕的。

改为命名空间模式如下:

var MYNP={};

MYNP.a=function(){};

MYNP.b=function(){};

MYNP.c=2;

MYNP.d=5;

MYNP.e={};

MYNP.e.name="Tina";

MYNP.f={};

也可以简写为

var MYNP={

a:function(){},

b:function(){},

c:2,

d:5,

e:{name:"Tina"},

f:{}

}

function d(){};

typeof MYNP.d//"number"

typeof d//"function"