xml架构将Range添加到属性和文本块

时间:2014-05-19 17:22:20

标签: c# xml xsd

我是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>

我想做一些事情,但我不知道如何去做,我想验证整数值是否低于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-->

2 个答案:

答案 0 :(得分:2)

有时,当XSD不能让你做你想做的事时,有一个原因。例如,诸如67和82之类的值实际上不是整数,因为它们不适合像减法这样的整数运算。它们实际上是1-8范围内的数字对。所以你可能最好用现代国际象棋符号标准的方式识别棋盘上的方块(&#34;代数符号&#34;),例如h1或e5。然后,您可以在XSD中将其描述为受正则表达式<xsd:pattern value="[a-h][1-8]"/>限制的字符串。 (当然你也可以使用限制在&#34; [1-8] [1-8]&#34;的字符串,但在我看来会让人感到困惑)。

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

答案 1 :(得分:1)

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

这将是这样的:

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

希望这有用; - )