【C# XML 】Namespaces ( xml命名空间) 和 xmlns 属性


https://i.cnblogs.com/posts/edit-done;postId=16056381

                https://www.w3.org/TR/REC-xml-names/#sec-namespaces

动机和总结

扩展名称分配给元素和属性来实现此目的。

XML 名称空间

Namespaces in XML1.0 的 W3C 建议定义的。XML 标记名应当是全局唯一的,由于性能方面的原因,XML 标记名还应该比较短。为了解决这种冲突,W3C 名称空间建议定义了属性 xmlns,它可以修改任何 XML 元素。如果它存在于元素中,那么它标识此元素的名称空间。

命名空间隐射的语法如下:

 xmlns 属性用于映射命名空间

xmlns:prefix=namespace  //扩展名称,扩展名称是一对key:value
xmlns=namespace  //默认命名空间xmlns 用来指定元素和属性来自那个命名空间。 xmlns=“” 无命名空间

版本

Namespaces in XML 1.1(<?xml version="1.1" encoding="US-ASCII"?>)
1、容许取消绑定已经绑定的前缀,默认命名空间可以取消
2、命名空间使用IRI格式命名( 的区别)


 与Namespaces in XML 1.0(<?xml version="1.0" encoding="US-ASCII"?>)
1、 容许取消绑定已经绑定的前缀,默认命名空间可以取消
2、命名空间使用URI格式命名( 的区别)

基本概念

以下是《Namespaces in XML1.0》规范中的部分内如:

1、命名空间声明有3种:默认Namespaces(只能有一个)和有名Namespaces、无名称Namespaces

"http://www.w3.org" //默认命名空间 该命名空间下是属性和元素不用加前缀
   xmlns:n2="http://www.w3.org/prefix" > //扩展命名空间 n2 使用该命名空间下是属性和元素要加前缀
 

 
2、声明命名空间 可应用与属性和元素,{默认命名空间} 不直接应用于属性。

//作用与属性
'http://ecommerce.example.org/schema'>
  
  "exempt">Baby food

//作用与元素
  'http://ecommerce.example.org/schema' units='Euro'>32.18

 3、命名空间可以被覆盖

声明一个 {默认命名空间} 意味着,若是 {默认命名空间} 声明范围内的任何元素未使用前缀显式限定,则该元素将被隐式限定。与带前缀的命名空间同样,{默认命名空间} 也能够被覆盖。{默认命名空间} 声明以下:

<?xml version="1.0"?>
"http://www.library.com">
    Sherlock Holmes
"http://www.foo.com"/>Arthur Conan Doyle //覆盖默认的命名空间

4、命名空间约束:以三字母序列 x、m 和 l(采用任何大小写组合)开头的前缀被保留

xmlns属性就是在命名空间中定义的。用于将命名空间URI/IRI 映射为简短的本地常量,方便文档中使用 命名空间。
5、XML Namespaces in XML1.0指定了使用URI格式的名称作为xml框架文档的名称(框架的标识符(身份证)),XML Namespaces in XML1.1推荐用IRI 作命名空间名称。
6、XML解析器处理命名空间IRI/URI时也仅仅将其作为字符串,URI不是真是存在的,仅仅用来标识xml文档。
7、空字符串虽然是合法的 URI 引用,但不能用作命名空间名称。
不推荐在命名空间声明中使用相对 URI 引用(包括同一文档引用)
8、可以将多个命名空间前缀声明为单个元素的属性

<?xml version="1.0"?>

'urn:loc.gov:books'
         xmlns:isbn='urn:ISBN:0-395-36341-6'>
    Cheaper by the Dozen
    1568491379

9、能取消默认命名空间绑定,默认命名空间声明中的属性值可能为空。在声明的范围内,这具有相同的效果,即没有默认命名空间。

<?xml version='1.0'?>

  
  'http://www.w3.org/1999/xhtml'>//不为空
NameOriginDescription
"">Huntsman "">Bath, UK
""><class>Bitterclass>Fuggles//为空,等于没有绑定命名空间 Wonderful hop, light alcohol, good summer beer Fragile; excessive variance pub to pub

10、属性的唯一性

在符合此规范的 XML 文档中,任何标记都不能包含两个属性:

(1)、具有相同的名称或
(2)、具有具有相同本地部分的限定名称,并且前缀已绑定到相同的命名空间名称。


"http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  "1"     a="2" />
  "1"  n2:a="2" />

取消声明命名空间

Namespaces in XML 1.0 W3C 推荐标准不容许取消绑定已经绑定的前缀,而 Namespaces in XML 1.1 W3C 推荐标准则容许这样作。1.0 没有理由不容许取消绑定,不过该错误已经在 1.1 中获得修正。没必要知道此差异,这是由于支持 Namespaces in XML 1.1 的 XML 分析器并很少。

尽管取消绑定带前缀的命名空间有一些差异,但这两个版本均容许您取消绑定或删除已声明的 {默认命名空间}:用其余 {默认命名空间} 声明(覆盖声明中的命名空间为空)覆盖已声明的 {默认命名空间}。取消绑定命名空间与未声明命名空间具备一样的效果。此处的 Sherlock Holmes - III 和 Sherlock Holmes - I 的元素 Book、Title 和 Author 与命名空间 http://www.library.com 关联,而Sherlock Holmes - II 的元素 purchase、 Title 和 Author {没有命名空间}:

<someElement xmlns="" />
<?xml version="1.0"?>
<Book xmlns="http://www.library.com">
    <Title>Sherlock Holmes - ITitle>
    <Author>Arthur Conan DoyleAuthor>
    <purchase xmlns="">
        <Title>Sherlock Holmes - IITitle>
        <Author>Arthur Conan DoyleAuthor>
    purchase>
    <Title>Sherlock Holmes - IIITitle>
    <Author>Arthur Conan DoyleAuthor>
Book>

此处是根据 XML 1.0 规范中的命名空间取消绑定前缀的无效示例,而根据 XML 1.1 中的命名空间取消绑定前缀则是有效的:

<purchase xmlns:lib="">

今后处开始,前缀 lib 不能在 XML 文档中使用,由于只要您在元素 purchase 的范围内,它就保持未声名状态。固然,您彻底能够再次定义它。

命名空间和 XML 框架(xml schemas)

到目前为止,咱们已经了解了如何声明和使用现有命名空间。如今,让咱们了解如何建立一个新命名空间,并使用 XML 模式将元素和属性添加到其中。

XML 模式首先是一个 XML。换言之,同任何其余 XML 文档同样,XML 框架使用元素和属性构建。此“构建材料”必须出自命名空间http://www.w3.org/2001/XMLSchema,它是已声明和保留的命名空间,其中包含 W3C XML 框架结构规范 和 W3C XML 框架数据类型规范 中定义的元素和属性。不该将元素或属性添加到该命名空间。

C