【C# XML 】Namespaces ( xml命名空间)

内如来源:https://i.cnblogs.com/posts/edit-done;postId=16056381

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

             中文反应版本:namespance 命名空间

动机和总结

我们设想了可扩展标记语言(XML)的应用程序,其中单个XML文档可能包含为多个软件模块定义和使用的元素和属性(此处称为"标记词汇表")。这样做的一个动机是模块化:如果存在这样一个很好理解的标记词汇表,并且有可用的有用软件,那么最好重用这个标记,而不是重新发明它。

此类文档包含多个标记词汇表,会带来识别和冲突问题。软件模块需要能够识别它们设计要处理的元素和属性,即使当用于其他软件包的标记使用相同的元素名称或属性名称时,也会发生"冲突"。

这些注意事项要求文档构造应构造名称,以避免来自不同标记词汇表的名称之间发生冲突。此规范描述了一种机制,即 XML 命名空间,该机制通过将扩展名称分配给元素和属性来实现此目的。

XML 名称空间

XML 命名空间提供了一种简单的方法来限定可扩展标记语言文档中使用的元素和属性名称,方法是将它们与 URI 引用标识的命名空间相关联。关联的文件就是XML Schema,有关xml框架语言请点击阅读

XML Namespaces提供了一种xml文档中避免元素名称冲突的方法

XML 名称空间是一组用 IRI/URI 引用标识的名称,这些名称在 XML 文档中用作元素类型和属性名称。

XML 名称空间是由 2006 年 8 月 16 日的名为 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格式命名(URL, URN, URI, IRI 的区别)


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

基本概念

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

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

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

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

//作用与属性
<x xmlns:edi='http://ecommerce.example.org/schema'>
  <!-- the 'taxClass' attribute's namespace is http://ecommerce.example.org/schema -->
  <lineItem edi:taxClass="exempt">Baby food</lineItem>
</x>
//作用与元素
  <edi:price xmlns:edi='http://ecommerce.example.org/schema' units='Euro'>32.18</edi:price>

 3、命名空间可以被覆盖

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

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

 

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"?>
<!-- both namespace prefixes are available throughout -->
<bk:book xmlns:bk='urn:loc.gov:books'
         xmlns:isbn='urn:ISBN:0-395-36341-6'>
    <bk:title>Cheaper by the Dozen</bk:title>
    <isbn:number>1568491379</isbn:number>
</bk:book>

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

<?xml version='1.0'?>
<Beers>
  <!-- the default namespace inside tables is that of HTML -->
  <table xmlns='http://www.w3.org/1999/xhtml'>//不为空
   <th><td>Name</td><td>Origin</td><td>Description</td></th>
   <tr> 
     <!-- no default namespace inside table cells -->
     <td><brandName xmlns="">Huntsman</brandName></td>
     <td><origin xmlns="">Bath, UK</origin></td>
     <td>
       <details xmlns=""><class>Bitter</class><hop>Fuggles</hop>//为空,等于没有绑定命名空间
         <pro>Wonderful hop, light alcohol, good summer beer</pro>
         <con>Fragile; excessive variance pub to pub</con>
         </details>
        </td>
      </tr>
    </table>

10、属性的唯一性

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

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

<!-- http://www.w3.org is bound to n1 and n2 -->
<x xmlns:n1="http://www.w3.org" 
   xmlns:n2="http://www.w3.org" >
  <bad a="1"     a="2" />
  <bad n1:a="1"  n2:a="2" />
</x>

 11、默认的命名空间

默认命名空间声明应用于作用域内所有不带前缀的元素名,默认命名空间不直接作用于属性名,不带前缀的属性名的解析将由它们出现所在的元素决定。

12、在实例中引用架构文档

 XML Schema提供了两个在实例文档中使用的特殊属性,用于指出模式文档的位置。这两个属性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用于声明了目标名称空间的模式文档,后者用于没有目标名称空间的模式文档,它们通常在实例文档中使用。

 xsi:schemaLocation属性
xsi:schemaLocation属性的值由一个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出架构文档的位置,架构处理器将从这个位置读取模式文档,该架构文档的目标名称空间必须与第一个URI相匹配。我们看例4-28。

例4-28  book6.xml

<?xml version="1.0" encoding="GB2312"?>
<book xmlns=" http://www.sunxin.org/book"   ①
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"  ②
xsi:schemaLocation=" http://www.sunxin.org/book http://www.sunxin.org/ 
book.xsd">  ③
<title>《Struts 2深入详解》</title>
<author>孙鑫</author>
</book>

① 声明默认的名称空间( http://www.sunxin.org/book)。
② 声明XML Schema实例名称空间( http://www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样架构处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。
③ 使用xsi:schemaLocation属性指定名称空间 http://www.sunxin.org/book和模式位置 http://www.sunxin.org/book.xsd相关。要注意,在这个例子中,book.xsd中声明的目标名称空间要求是 http://www.sunxin.org/book。

 

13、同一个命名空间既可以用于实际工作,也可以在根据外部组件定义模式组件的过程中使用:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:html="http://www.w3.org/1999/xhtml"
        targetNamespace="uri:mywork" xmlns:my="uri:mywork">

 <import namespace="http://www.w3.org/1999/xhtml"/>

 <annotation>
  <documentation>
   <html:p>[Some documentation for my schema]</html:p>
  </documentation>
 </annotation>

内容来源:https://www.w3.org/TR/xmlschema-1/#xsi.noNamespaceSchemaLocation

14、schemaLocation 绑定xsd多个架构

<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform"
            xmlns:html="http://www.w3.org/1999/xhtml"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform
                                http://www.w3.org/1999/XSL/Transform.xsd
                                http://www.w3.org/1999/xhtml
                                http://www.w3.org/1999/xhtml.xsd">

    1、sdx文件前缀通常用xsi                        
    2、xsi:schemaLocation属性的值可以由多个URI引用对组成
    3、解析器在解析xsi:schemaLocation时会忽略xsi ,只解析schemaLocation后面 的键值对,根据命名空间 找到相应的具体xsd文件。    
    4、此外,要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:schemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:schemaLocation属性。    
    
 内容来源:https://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation

15、 不绑定命名空间xsi:noNamespaceSchemaLocation属性

 <?xml version="1.0" encoding="GB2312"?>
<book xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="book.xsd" 
isbn="978-7-121-06812-6" >
<title>《Struts 2深入详解》</title>
<author>孙鑫</author>
</book>

1、xsi:noNamespaceSchemaLocation属性用于引用没有目标名称空间的模式文档。与xsi:schemaLocation属性不同的是,xsi:noNamespaceSchemaLocation属性的值是单一的值,只是用于指定架构文档的位置。例4-31显示了在实例文档中xsi:noNamespaceSchema Location属性的使用。
 2、此外,要注意的是,XML Schema推荐标准并没有要求架构处理器必须要使用xsi:noNamespaceSchemaLocation属性,某些架构处理器可以通过其他的方式来得到架构文档的位置,而忽略xsi:noNamespaceSchemaLocation属性。
 

取消声明命名空间

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 - I</Title>
    <Author>Arthur Conan Doyle</Author>
    <purchase xmlns="">
        <Title>Sherlock Holmes - II</Title>
        <Author>Arthur Conan Doyle</Author>
    </purchase>
    <Title>Sherlock Holmes - III</Title>
    <Author>Arthur Conan Doyle</Author>
</Book>

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

<purchase xmlns:lib="">

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

 

XML处理器

可以读取和处理XML文档的任何程序被称为XML处理器。
XML处理器被划分为验证或无验证类型,这取决于他们是否检查XML文档的有效性。在发现一个有效性的错误处理器必须能够汇报,但可继续进行正常的处理.

    一些验证解析器 : xml4c (IBM, in C++), xml4j (IBM, in Java), MSXML (Microsoft, in Java), TclXML (TCL), xmlproc (Python), XML::Parser (Perl), Java Project X (Sun, in Java).
    一些非验证解析器 : OpenXML (Java), Lark (Java), xp (Java), AElfred (Java), expat (C), XParse (JavaScript), xmllib

命名空间和 XML 模式(也叫XML架构)

 

 

 

 

 

 

 

 

 

 

内如来源:http://www.noobyard.com/article/p-ciylhgkx-dd.html

 

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

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

使用这些构建块,能够根据须要建立新元素和属性,并对这些元素和属性附加所需的约束,并将其保留在某个命名空间中。(请参见 图 1。)XML 模式将此特殊命名空间称做 {目标命名空间},即新建的元素和属性将驻留到的命名空间。

 

图 1:XML 模式命名空间中的元素和属性用于编写 XML 模式文档,

该文档生成由用户定义的元素和属性并将其置于 {目标命名空间} 中。

此 {目标命名空间} 随后用于验证 XML 实例。

 

此 {目标命名空间} 从 XML 实例中引用,以确保实例文档的有效性。(请参见 图 2 。)在验证过程当中,验证器验证明例中所用的元素/属性是否存在于已声明的命名空间中,并检查是否对其结构和数据类型存在其余约束。

 

图 2:从 XML 模式到 XML 模式实例


http://www.w3.org/2001/XMLSchema-instance 命名空间 提供了两个在实例文档中使用的特殊属性,用于指出模式文档的位置。这两个属性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用于声明了目标名称空间的框架文档,后者用于没有目标名称空间的框架文档,它们通常在实例文档中使用。

 

限定或未限定

 

在 XML 模式中,咱们能够选择指定实例文档是必须限定全部元素和属性,仍是只限定全局声明的元素和属性。不管作出什么样的选择,都将验证整个实例。那么,咱们为何有两个选择呢?

答案是“可管理性”。当咱们选择 限定 时,咱们指定实例中的全部元素和属性都必须有一个命名空间,这将加强实例的命名空间复杂性。好比,当因将某些局部声明变为全局声明和/将某些全局声明变为局部声明而修改了模式时,根本不会影响实例文档。相反,若是选择 非限定,则指定只有实例中全局声明的元素和属性才必须具备命名空间,从而隐藏实例的命名空间复杂性。但在此情形下,好比,当因将某些局部声明变为全局声明和/将某些全局声明变为局部声明而修改了模式时,将影响全部实例文档 — 且实例再也不有效。若是试图根据已修改的 XML 模式验证该实例,则 XML 模式验证器将报告验证错误。所以,必须根据 XML 模式中所做的修改修正命名空间,才能从新使该实例有效。

 

<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://www.library.com"
        targetNamespace="http://www.library.com"
        elementFormDefault="qualified">
    attributeFormDefault="unqualified">
    <element name="Book" type="tns:BookType" />
    <complexType name="BookType">
        <sequence>
            <element name="Title" type="string" />
            <element name="Author" type="string" />
        </sequence>
    </complexType>
</schema>

 

元素 <schema> 的最近子元素为全局声明,而其余元素则为局部声明。在以上示例中, Book 和 BookType 被全局声明,而 Title 和Author 则被局部声明。

能够经过将模式元素属性 elementFormDefault 和 attributeFormDefault 设置为 qualified 或 unqualified 表示在限定和非限定之间的选择。

elementFormDefault   = (qualified | unqualified) :unqualified
attributeFormDefault = (qualified | unqualified) :unqualified

当将 elementFormDefault 设置为 qualified 时,它表示在该语法的实例中,必须使用前缀或经过设置 {默认命名空间} 来显式限定全部元素。 unqualified 设置意味着只有全局声明的元素才 必须 被显式限定,而局部声明的元素 不得 被限定。在此情形下,限定一个局部声明是错误的。一样,将 attributeFormDefault 设置为 qualified 时, 必须使用前缀显式限定实例文档中的全部属性。

注意,{默认命名空间} 不该用于属性;所以,不能使用 {默认命名空间} 声明限定属性。 Unqualified 好像暗示经过包含的元素位于命名空间中。这颇有趣,对吧?

在下图中,概念符号空间相似于命名空间分区的非规范性概念。例如,若是将命名空间比做电冰箱,那么符号空间就是冰箱中的架子。就像架子对电冰箱中的整个空间进行分区同样,符号空间对命名空间进行分区。

命名空间中有三个主要分区:一个用于全局元素声明,一个用于全局属性声明,一个用于全局类型声明 (complexType/simpleType)。这种安排表示,全局元素、全局属性和全局类型能够具备相同的名称,并能够在 {目标命名空间} 中共存而不发生任何名称冲突。此外,每一个全局元素和全局 complexType 拥有其本身的符号空间来包含局部声明。

 

让咱们来看看属性对 elementFormDefault 和 attributeFormDefault 的四种可能的值组合。

情形 1: elementFormDefault=qualified, attributeFormDefault=qualified

此处,{目标命名空间} 直接包含全部元素和属性;所以在该情形中,必须限定全部元素和属性。

 

情形 2: elementFormDefault=qualified, attributeFormDefault=unqualified

此处,{目标命名空间} 直接包含全部元素,且这些元素的相应属性包含在相应元素的符号空间中。所以,在该情形中,只须限定元素,而不得限定属性,除非属性是全局声明的。

 

情形 3: elementFormDefault=unqualified, attributeFormDefault=qualified

此处,{目标命名空间} 直接包含全部属性和仅全局声明的元素,同时这些元素在其符号空间中包含其子元素。所以,在该情形中,只虚限定全局声明的元素和全部属性。

 

情形 4: elementFormDefault=unqualified, attributeFormDefault=unqualified

此处,{目标命名空间} 直接包含仅在全局声明的元素,同时这些元素在其符号空间中包含其子元素。每一个元素在其符号空间中包含相应的属性;所以,在该情形中,只需限定仅在全局声明的元素和属性。

 

以上各图用于直观说明命名空间内直接包含的内容或传递式包含的内容(取决于elementFormDefaultattributeFormDefault 的值)。该设置表示直接位于{目标命名空间} 中的元素/属性必须在相应的 XML 实例中拥有一个与其关联的命名空间,而未直接(传递式)位于 {目标命名空间} 中的元素/属性不得在相应的 XML 实例中拥有一个与其关联的命名空间。

 

目标命名空间和无目标命名空间

如今,咱们知道 XML 模式建立新元素和属性并将其置于称做 {目标命名空间} 的命名空间中。但若是在该模式中未指定 {目标命名空间} 又会怎么样?若是未指定属性targetNamespace,则将不存在 {目标命名空间} — 这是合法的 —但在targetNamespace 属性中指定一个空 URI 则是“非法”的。

例如,如下代码无效。不能为 {目标命名空间} 指定一个空 URI:

<schema targetNamespace="" . . .>

在此情形中,若是不存在 {目标命名空间},则如前所述,则将新建的元素和属性保存在 {无命名空间} 中。(使用术语 {默认命名空间} 是错误的。)要验证相应的 XML 实例,相应的 XML 实例必须使用 http://www.w3.org/2001/XMLSchema-instance 命名空间中的 noNamespaceSchemaLocation 属性来引用没有目标命名空间的 XML 模式。

结论

 

衷心但愿此命名空间概述可以帮助您更轻松地迁移到 XML 模式。Oracle XML 开发人员工具包 (XDK) Namespaces in the XML 1.0 W3C 推荐标准中的 W3C 命名空间;您能够经过使用 SAXParserFactory 和 DocumentBuilderFactory 类中的setNamespaceAware(boolean) 方法打开/关闭命名空间检查(使用 Oracle XDK 中的 JAXP API)。

 

 

XPath查询与xmlns属性

 

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

 

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

 

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

 

posted @ 2022-03-25 19:51  小林野夫  阅读(1889)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/