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
public、protected、private對應著類或成員的權限。
internal也是一各類型/成員修飾符(被修飾的類型或者成員稱為內部類型或成員),只是它所修飾的類只能在同一個程序集中被訪問,而同一個程序集表示同一個dll程序集或同一個exe程序集。
命名空間的設計目的是提供一種讓一組名稱與其他名稱分隔開的方式。在一個命名空間中聲明的類的名稱與另一個命名空間中聲明的相同的類的名稱不沖突。
命名空間可以將不同的程序集(功能)隔離開來。
圖片來源https://www.runoob.com/csharp/csharp-namespace.html
命名空間的定義是以關鍵字 namespace 開始,后跟命名空間的名稱,如下所示:
namespace namespace_name
{
// 代碼聲明
}
為了調用支持命名空間版本的函數或變量,會把命名空間的名稱置于前面,如下所示:
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)測試結果
使用 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)測試結果
參考了https://blog.csdn.net/wuqiang20081807/article/details/78470003
(1)程序集可以理解成一個個不同的DLL
(2)程序集和命名空間不存在必然聯系,一個程序集可以包含多個命名空間,同一個命名空間也可以分放在幾個程序集。
(3)命名空間是邏輯上的組織單元,而程序集是物理上的組織單元。一個程序集可以包含多個命名空間,而一個命名空間也可以跨越多個程序集。程序集的名稱通常包含其命名空間,以便于識別和管理。
在vs中一個項目會生成一個dll文件,因此這個dll或這個項目也就是一個程序集。比如下面的一個dll:
namespace Common
{
internal class A
{
public void aa()
{
}
}
public class B
{
public void bb()
{
//這樣是正確的
A a=new A();
a.aa();
}
}
}
如果另一個項目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();
}
}
}
一般一個成員或類型只能有一個訪問修飾符,但使用protected internal組合時除外,它的訪問僅限于從包含類派生的當前程序集或類型。即我們可以在本程序集中訪問,也可以在其他程序集中繼承訪問。如下:
名空間
主要作用就是減少全局變量,避免變量之間的命名沖突,使全局空間最大化的整潔。
不使用命名空間模式的情況如下
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"
*請認真填寫需求信息,我們會在24小時內與您取得聯系。