【C# XML 】XML Shcema
具体教程请看
https://www.w3school.com.cn/schema/schema_complex.asp
xsd框架 图
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.
<schema> 元素是每一个 XML Schema 的根元素。
限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
内容来源:https://www.w3school.com.cn/schema/schema_intro.asp
学习xml Schema之前您应当具备的基础知识
在继续学习之前,您需要对下面的知识有基本的了解:
- HTML / XHTML
- XML 以及 XML 命名空间
- 对 DTD 的基本了解
XML Schema学习资料
内如来源:http://www.noobyard.com/article/p-ciylhgkx-dd.html
注意点:1、notation 元素
notation 元素描述 XML 文档中非 XML 数据的格式。
实例 1 下面的例子通过使用一个查看应用程序 view.exe 来显示 gif 和 jpeg 格式的 notation: <?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:notation name="gif" public="image/gif" system="view.exe"/> <xs:notation name="jpeg" public="image/jpeg" system="view.exe"/> <xs:element name="image"> <xs:complexType> <xs:simpleContent> <xs:attribute name="type"> <xs:simpleType> <xs:restriction base="xs:NOTATION"> <xs:enumeration value="gif"/> <xs:enumeration value="jpeg"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema> 文档中的 "image" 元素是这样的: <image type="gif"></image>
命名空间
到目前为止,咱们已经了解了如何声明和使用现有命名空间。如今,让咱们了解如何建立一个新命名空间,并使用 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命名空间提供了两个特殊的属性elementFormDefault/attributeFormDefault,用于指定在实例文档中全局元素/属性 绑定命名空间的方式
http://www.w3.org/2001/XMLSchema命名空间用于框架文档种定义框架。elementFormDefault/attributeFormDefault也用于框架文档种定义全局元素/属性如何绑定命名空间
unqualified:全局元素/属性绑定 命名空间,父元素前面要添加前缀,子元素 采用默认的方式,子元素不用添加前缀。
qualified::全局元素/属性绑定 命名空间,子元素和父元素都要添加命名空间前缀
目标命名空间和无目标命名空间
如今,咱们知道 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)。
实例文档中定位命名空间所在的位置
http://www.w3.org/2001/XMLSchema-instance 命名空间 提供了两个在实例文档中使用的特殊属性,用于指出命名空间文档的位置。这两个属性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用于声明了目标名称空间的框架文档,后者用于没有目标名称空间的框架文档,它们通常在实例文档中使用。
将XML Schemas 与XML 实例文档关联起来
Schema 框架文档用来验证XML实例文档的正确性,用来判断实例是否符合框架中所描述的所有约束,涉及到检查实例中所有的元素和属性。
1、应用xml-model指令
为了让xml schemas 约束xml 实例文档种的元素,就必须使用<?xml-model href="框架地址"?>指令将他们关联起来
引用自:Associating Schemas with XML documents 1.0 (Third Edition)
2、使用命名空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 提供了两个特殊的属性 schemaLocation、noNamespaceSchemaLocation 来链接数据库 框架文档
如下:
实例代码, k线
<?xml version="1.0" encoding="utf-8" ?> <msn:Stock xmlns:msn="http://tempuri.org/Stock" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/Stock Stock.xsd" > <msn:Company >dfdf</msn:Company> <msn:KLine> <msn:OpenPrice>15</msn:OpenPrice> <msn:ClosePrice>15.54</msn:ClosePrice> <msn:HightPrice>15.90</msn:HightPrice> <msn:LowPrice>14.90</msn:LowPrice> </msn:KLine> <msn:KLine> <msn:OpenPrice>16</msn:OpenPrice> <msn:ClosePrice>17.54</msn:ClosePrice> <msn:HightPrice>17.54</msn:HightPrice> <msn:LowPrice>15.90</msn:LowPrice> </msn:KLine> <msn:Person id="rbach"> <Name>dff</Name> </msn:Person> <msn:Book> <Title>Illusions</Title> <Author idref="rbach"/> </msn:Book> </msn:Stock>
框架代码,定义一个股票 K线框架 ,文件名Untitled-1.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tempuri.org/Stock" xmlns="http://tempuri.org/Stock" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="1.0" xml:lang="en" > <!--=====================================定义k线 Type=========================================--> <!--定义一个类型 表示股价的范围--> <xs:simpleType name="PriceRang"> <xs:restriction base="xs:decimal"> <xs:minInclusive value ="0"></xs:minInclusive> <xs:maxExclusive value="10000000000"></xs:maxExclusive> </xs:restriction> </xs:simpleType> <!--定义K线复合元素--> <xs:complexType name="OCHLElement" mixed="true" > <xs:sequence > <xs:element ref="OpenPrice" maxOccurs="1" minOccurs="1"/> <xs:element ref="ClosePrice" maxOccurs="1" minOccurs="1"/> <xs:element ref="HightPrice" maxOccurs="1" minOccurs="1"/> <xs:element ref="LowPrice" maxOccurs="1" minOccurs="1"/> </xs:sequence> </xs:complexType> <!--==============================================================================--> <!--定义公司名称 范围--> <xs:complexType name="stock" > <xs:sequence > <xs:element ref="Company" maxOccurs="1"/> <xs:element ref="KLine" maxOccurs="unbounded"/> <xs:element ref="Person" maxOccurs="1"/> <xs:element ref="Book" maxOccurs="1"/> </xs:sequence> <xs:anyAttribute /> </xs:complexType> <xs:attribute name="gender"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="male|female"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="address" > <xs:simpleType > <xs:restriction base="xs:string"> <xs:pattern value ="北京|上海|天津|湖南" xml:lang="zh"/> </xs:restriction> </xs:simpleType> </xs:attribute > <!--定义公司名称 范围--> <xs:simpleType name="CompanyNameRang"> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]+"/> </xs:restriction> </xs:simpleType> <!--定义简易元素--> <xs:element name="OpenPrice" type="PriceRang"/> <xs:element name="ClosePrice" type="PriceRang"/> <xs:element name="HightPrice" type="PriceRang"/> <xs:element name ="LowPrice" type="PriceRang"/> <xs:element name="KLine" type="OCHLElement" /> <!--根元素--> <xs:element name ="Stock" type="stock" /> <xs:element name ="Company" type="CompanyNameRang" /> <!--以下部分用于测试elementFormDefault/attributeFormDefault--> <xs:complexType name="PersonType"> <xs:sequence> <xs:element name="Name" type="xs:string"/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="required"/> </xs:complexType> <xs:complexType name="AuthorType"> <xs:attribute name="idref" type="xs:IDREF" use="required"/> </xs:complexType> <xs:complexType name="BookType"> <xs:sequence> <xs:element name="Title" type="xs:string"/> <xs:element name="Author" type="AuthorType"/> </xs:sequence> </xs:complexType> <xs:element name="Person" type="PersonType"/> <xs:element name="Book" type="BookType"/> </xs:schema>
将多个 XML Schemas框架合并在一起-分模块设计
一个框架可能由多个框架文档构成。多个框架文档通过包含或导入机制来形成框架,当其他框架文档与主框架文档具有相同的目标名称空间时,需要使用包含;当框架文档之间各自拥有不同的目标名称空间时,需要使用导入。下面的例子建立一个单独用来验证实例的框架文档。
当我们在设置一个大型的配置文件时候 用一个xml 显得太复杂,这时候我们可以将这个大型的配置文件分成多个xml 文件。然后通过import 标签或include标签组合在一起。
1、采用import 标签导入和 当前命名空间名称不一样的xsd文件
2、采用include标签导入 和当前命名空间名称一样的xsd文件
例如:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-student.xml"/>
<import resource="spring-student-dtd.xml"/>
</beans>
xml Schemas 编辑器
vs code +xml tools
xml Schemas 设计模式
设计模式有5种,三种常用的(套娃、切香肠、百叶窗)和2种不常用的(伊甸园、百叶窗)
1、俄罗斯 套娃(Russian Doll)
(1)、具有的特点:
具有单个全局根元素。
所有类型都有局部类型,即嵌入在根元素中。
只支持用单个文件完整设计的Schema。
它具有高内聚低耦合。
由于类型被隐藏,Schema是完全封装的。
它是最易于阅读和编写的模式。
不受命名空间限定符的阻碍
(2)、简易优缺点:
优点:易于阅读和编写;结果可以预期;容易理解作者的意图;完全自包含,改变类型将不会影响其他的Schema。
缺点:精心定义的类型无法在别处重复使用。
(3)、应用:用来存储隔离记录的中端上的一修改DB2文件系统表?
<xsd:element name="Person"> <xsd:complexType> <xsd:sequence> <xsd:element name="Name" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="Book"> <xsd:complexType> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author"> <xsd:complexType> <xsd:attribute name="idref" type="xsd:IDREF" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element>
2、Salami Slice(具有紧密耦合)
(1)、具有的特点:
所有元素和属性都是全局元素。因此,它们的命名空间将始终在实例文档中公开,而不管 elementFormDefault “switch” 的值如何。
所有元素都在全局命名空间中定义。
所有类型都是局部类型。
元素声明从不嵌套。
元素声明可以重复使用。Salami Slice使你最有可能重复使用所有Schema设计模式。
很难确定目标根元素,因为存在许多潜在选项。
(2)、简易优缺点:
优点:元素全局声明,生成的Schema可以被重复使用;
缺点:改变某个元素会影响组合的元素;
<xsd:element name="Name" type="xsd:string"/> <xsd:attribute name="id" type="xsd:ID"/> <xsd:element name="Person"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Name"/> </xsd:sequence> <xsd:attribute ref="id" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="Title" type="xsd:string"/> <xsd:attribute name="idref" type="xsd:IDREF"/> <xsd:element name="Author"> <xsd:complexType> <xsd:attribute ref="idref" use="required"/> </xsd:complexType> </xsd:element> <xsd:element name="Book"> <xsd:complexType> <xsd:sequence> <xsd:element ref="Title"/> <xsd:element ref="Author"/> </xsd:sequence> </xsd:complexType> </xsd:element>
3、百叶窗(Venetian Blind)
具有的特点:
具有单个全局根元素。
混合有全局和局部声明。这与Russian Doll和Salami Slice形成对比;Russian Doll中的所有类型都是局部的,Salami Slice中的所有类型都是全局的。
既具有高内聚,又具有高耦合。由于其组件是耦合的,不是自包含的,它可以不时地和其他Schema耦合。
它最大化了重复使用,所有类型和根元素都可以重新组合。
由于类型是可见的,因此封装是有限的。
允许你使用多个文件定义Schema。比较冗长。将每个类型拆分,使你可以对各个单个方面或元素进行非常有选择性的粒度控制,不过这会使用键入的内容非常多。
<xsd:complexType name="PersonType"> <xsd:sequence> <xsd:element name="Name" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="xsd:ID" use="required"/> </xsd:complexType> <xsd:complexType name="AuthorType"> <xsd:attribute name="idref" type="xsd:IDREF" use="required"/> </xsd:complexType> <xsd:complexType name="BookType"> <xsd:sequence> <xsd:element name="Title" type="xsd:string"/> <xsd:element name="Author" type="Author"/> </xsd:sequence> </xsd:complexType> <xsd:element name="Person" type="PersonType"/> <xsd:element name="Book" type="BookType"/>
4、伊甸园(Garden of Eden)
Garden of Eden Schema设计模式由Sun Microsystems确立,它是Salami Slice 和 Venetian Blind的组合。要是Schema采用这种模式,可以在全局命名空间中定义所有的元素和类型,然后根据需要引用相应元素。
5、变色龙(Chameleon)
Chameleon模式非常灵活,它的方式是让你在命名空间的Schema(称为Chameleon)中设计常见类型,然后定义一个主Schema,这个Schema在自己的命名空间中通过<include>将第一个Schema包含进来,Chameleon中的常见类型被强制赋予命名空间,使用的是主Schema中定义的命名空间。
Chameleon设计模式的使用是饱受争议的。Chameleon依赖于Schema规范中的一些方面,而对于这些方面的解释,供应商们并不是完全赞同。此外,Chameleon通常会在验证过程中降低性能,哪怕是从支持它的供应商进行验证,这是命名空间解决方案的延迟妨碍了分析器基于命名空间来缓存Schema的组件。Chameleon还使XPath身份约束的使用受到限制。XPath不使用默认的命名空间。