C# 向属性和文本块添加范围的xml架构

C# 向属性和文本块添加范围的xml架构,c#,xml,xsd,C#,Xml,Xsd,我是xml模式的新手,我在学校有一个制作棋盘模式的项目。 事情进展顺利。我想我可以用c#来解析它,以确保它都是有效的,但我更希望模式能够抓住这个问题。 这就是问题所在 我有一个xml文档,它将这些片段转换为一个修饰符和一个位置 <pieces> <black> <!--Pawns--> <piece modifier="P">17</piece> <piece modifier="P"&

我是xml模式的新手,我在学校有一个制作棋盘模式的项目。 事情进展顺利。我想我可以用c#来解析它,以确保它都是有效的,但我更希望模式能够抓住这个问题。 这就是问题所在

我有一个xml文档,它将这些片段转换为一个修饰符和一个位置

<pieces>
    <black>
      <!--Pawns-->
      <piece modifier="P">17</piece>
      <piece modifier="P">27</piece>
      <piece modifier="P">37</piece>
      <piece modifier="P">47</piece>
      <piece modifier="P">57</piece>
      <piece modifier="P">67</piece>
      <piece modifier="P">77</piece>
      <piece modifier="P">87</piece>

      <!--Rooks-->
      <piece modifier="R">18</piece>
      <piece modifier="R">88</piece>

      <!--Knights-->
      <piece modifier="N">28</piece>
      <piece modifier="N">78</piece>

      <!--Bishops-->
      <piece modifier="B">38</piece>
      <piece modifier="B">68</piece>

      <!--Royalty-->
      <piece modifier="Q">48</piece>
      <piece modifier="K">58</piece>
    </black>
</pieces>

17
27
37
47
57
67
77
87
18
88
28
78
38
68
48
58
有几件事我想做,但我不知道怎么做,我想验证整数值不低于11,不高于88。这就是我现在拥有的。我看过其他类似主题的堆栈溢出帖子,但找不到有效的

<xs:element name="black">
  <xs:complexType>
     <xs:sequence>

        <xs:element name="piece" minOccurs="0" maxOccurs="16">
          <xs:complexType>
            <xs:simpleContent>
               <xs:extension base="xs:integer">
                  <xs:attribute name="modifier" type="xs:string"/>
               </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element><!--End Piece-->

    </xs:sequence>
  </xs:complexType>
</xs:element><!--End black-->

您必须声明一个新的简单类型,然后应用以该简单类型为基础的扩展

这将是这样的:

<xs:element name="black">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="piece" minOccurs="0" maxOccurs="16">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="BlackModifiedPiece">
              <xs:attribute name="modifier" type="xs:string"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:simpleType name="BlackModifiedPiece">
  <xs:restriction base="xs:int">
    <xs:minInclusive value="11"/>
    <xs:maxInclusive value="88"/>
  </xs:restriction>
</xs:simpleType>


希望这有帮助;-)

有时候XSD不让你做你想做的事情,这是有原因的。例如,您的值(如67和82)不是真正的整数,因为它们不适用于减法等整数运算。它们实际上是1-8范围内的数字对。因此,您最好使用现代国际象棋符号(“代数符号”)中的标准方式识别棋盘上的方块,例如h1或e5。然后,您可以在XSD中将其描述为受正则表达式限制的字符串
。(当然,您也可以使用限制为“[1-8][1-8]”的字符串,但在我看来,这会令人困惑)

如果你想开始在你的模式中表达国际象棋的语义规则,例如,通过拥有每种颜色的棋子不能超过八个,并且棋子不能在后排的规则,那么你需要开始使用XSD 1.1断言