【C# XML 】XML Shcema


具体教程请看

https://www.w3school.com.cn/schema/schema_complex.asp

下面只做简要的记录

XML Schema定义

XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)

XML schema是指各种XML架构文档(称作schema)描述一組规则(也称模式xml)用来规范实例xml中 元素、属性、复杂与简单数据类型的使用。这套规则所采用的语言就是xml。其中被W3C采纳为推荐标准的schema语言是XSD.

元素是每一个 XML Schema 的根元素。

限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。

内容来源:https://www.w3school.com.cn/schema/schema_intro.asp

学习xml Schema之前您应当具备的基础知识

在继续学习之前,您需要对下面的知识有基本的了解:

  • HTML / XHTML
  • XML 以及
  • 对 DTD 的基本了解

XML Schema合法构建模块:

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的次序
  • 定义子元素的数目
  • 定义元素是否为空,或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

XML Schema 是 DTD 的继任者

我们认为 XML Schema 很快会在大部分网络应用程序中取代 DTD。

理由如下:

  • XML Schema 可针对未来的需求进行扩展
  • XML Schema 更完善,功能更强大
  • XML Schema 基于 XML 编写
  • XML Schema 支持数据类型
  • XML Schema 支持命名空间

XML 架构 元素

该栏目内容来源:XML 架构元素 (w3schools.com)

定义和用法

架构元素定义架构的根元素。

元素信息

  • 父元素:没有

语法

<schema
id=ID
attributeFormDefault=qualified|unqualified
elementFormDefault=qualified|unqualified
blockDefault=(#all|list of (extension|restriction|substitution))
finalDefault=(#all|list of (extension|restriction|list|union))
targetNamespace=anyURI
version=token
xmlns=anyURI
any attributes
>

((include|import|redefine|annotation)*,(((simpleType|complexType|
group|attributeGroup)|element|attribute|notation),annotation*)*)

解析

AttributeDescription
id 可选的。为元素指定一个唯一的ID
attributeFormDefault 可选的。此模式的目标名称空间中声明的属性的形式。取值必须为qualified或unqualified。默认设置是“qualified”。" unqualified"表示不需要用名称空间前缀限定目标名称空间的属性。"qualified"表示来自目标名称空间的属性必须用名称空间前缀限定
elementFormDefault 可选的。此模式的目标名称空间中声明的元素的形式。取值必须为qualified或unqualified。默认设置是“unqualified”。"unqualified"表示来自目标名称空间的元素不需要用名称空间前缀限定。"qualified"表示来自目标名称空间的元素必须用名称空间前缀进行限定
blockDefault 可选的。指定目标命名空间中 element 和 complexType 元素上 block 属性的默认值。block属性可以防止具有指定派生类型的复合类型(或元素)被用来代替这个复合类型。这个值可以包含#all或一个列表,这个列表是扩展、限制或替换的子集。

    扩展 - 防止通过扩展衍生的复杂类型
    限制--防止通过限制派生的复杂类型
    替换 - 防止元素的替换
    #all - 防止所有衍生的复杂类型
finalDefault 可选的。指定目标命名空间中 element、simpleType 和 complexType 元素的 final 属性的默认值。final属性防止元素、simpleType或complexType元素的指定衍生类型。对于element和complexType元素,这个值可以包含#all或一个列表,是扩展或限制的子集。对于simpleType元素,这个值可以另外包含list和union。

    扩展 - 防止通过扩展进行推导
    restriction - 防止通过限制进行推导
    list - 防止通过列表推导
    union - 防止通过union进行派生
    #all - 防止所有的派生
targetNamespace 可选的。该架构的名称(URI)
version Optional. 指定该架构的版本
xmlns

它指定了一个或多个命名空间URI引用,用于当前架构中。如果没有指定前缀,则名称空间的模式组件(元素 属性)可以不使用前缀

any attributes 可选的。指定任何其他属性,这些属性不在架构命名空间中

XSD 元素

 

元素解释
all 规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。
annotation annotation 元素是一个顶层元素,规定 schema 的注释。
any 使创作者可以通过未被 schema 规定的元素来扩展 XML 文档。
anyAttribute 使创作者可以通过未被 schema 规定的属性来扩展 XML 文档。
appInfo 规定 annotation 元素中应用程序要使用的信息。
attribute 定义一个属性。
attributeGroup 定义在复杂类型定义中使用的属性组。
choice 仅允许在 声明中包含一个元素出现在包含元素中。
complexContent 定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。
complexType 定义复杂类型。
documentation 定义 schema 中的文本注释。
element 定义元素。
extension 扩展已有的 simpleType 或 complexType 元素。
field 规定 XPath 表达式,该表达式规定用于定义标识约束的值。
group 定义在复杂类型定义中使用的元素组。
import 向一个文档添加带有不同目标命名空间的多个 schema。
include 向一个文档添加带有相同目标命名空间的多个 schema。
key 指定属性或元素值(或一组值)必须是指定范围内的键。
keyref 规定属性或元素值(或一组值)对应指定的 key 或 unique 元素的值。
list 把简单类型定义为指定数据类型的值的一个列表。
notation 描述 XML 文档中非 XML 数据的格式。
redefine 重新定义从外部架构文件中获取的简单和复杂类型、组和属性组。
restriction 定义对 simpleType、simpleContent 或 complexContent 的约束。
schema 定义 schema 的根元素。
selector 指定 XPath 表达式,该表达式为标识约束选择一组元素。
sequence 要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数。
simpleContent 包含对 complexType 元素的扩展或限制且不包含任何元素。
simpleType 定义一个简单类型,规定约束以及关于属性或仅含文本的元素的值的信息。
union 定义多个 simpleType 定义的集合。
unique 指定属性或元素值(或者属性或元素值的组合)在指定范围内必须是唯一的。

数据类型的限定

限定描述
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。

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

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

到目前为止,咱们已经了解了如何声明和使用现有命名空间。如今,让咱们了解如何建立一个新命名空间,并使用 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 模式实例

限定或未限定

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

元素  的最近子元素为全局声明,而其余元素则为局部声明。在以上示例中, 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:

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



C