【C# XML 】XML Shcema

具体教程请看

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

XML文档类型定义---XML Schema结构

 

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之前您应当具备的基础知识

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

XML Schema学习资料

XML 架构元素 (w3schools.com)

XSD 元素

数据类型的限定

内如来源: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不使用默认的命名空间。

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