我是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-->
答案 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>
希望这有用; - )