我有一个包含这样的XML结构:
<goal id="doStuff" .. />
<score goal="doStuff" value="true" points="10" />
效果很好...直到输入变得更复杂:分数现在可以依赖多个目标。我们考虑过:
<goal id="doStuff" .. />
<goal id="doOtherStuff" .. />
<goal id="dontDoThis" .. />
<score goal1="doStuff" value1="true" points="10" />
<score goal1="doOtherStuff" value1="true" goal2="dontDoThis" value2="false" points="20" />
但是分数可以依赖的目标数量没有限制,所以在某些时候这种格式可能会破裂。最后我们提出了:
<goal id="doStuff" .. />
<goal id="doOtherStuff" .. />
<goal id="dontDoThis" .. />
<score doStuff="true" points="10" />
<score doOtherStuff="true" dontDoThis="false" points="20" />
这适用于应用程序本身,但我一直无法弄清楚如何编写XML Schema来正确验证这一点;它似乎不可能有另一个元素定义的元素的有效名称(我必须承认只读过XML Schema规范的第0部分,我只在第1部分和第2部分投掷了几个Ctrl + Fs。)
分数必须根据我无法控制的规则计算;例如,改变定义目标的方式不是一种选择。我唯一的灵活性是XML的结构。有人可以建议一种方法将给定结构编码为XML,以便可以使用XML Schema进行验证吗?
答案 0 :(得分:0)
如果您可以自由修改XML的结构,可以考虑将所需目标添加为分数的子元素,如下所示:
<goal id="doStuff" />
<goal id="doOtherStuff" />
<goal id="dontDoThis" />
<score points="10">
<scoreGoal goal="doStuff" value="true" />
</score>
<score points="20">
<scoreGoal goal="doOtherStuff" value="true" />
<scoreGoal goal="dontDoThis" value="false" />
</score>
然后您可以验证您的架构,例如:
<xs:sequence>
<xs:element maxOccurs="unbounded" name="goal">
<xs:complexType>
<xs:attribute name="id" type="xs:string" use="required" />
<!--...-->
</xs:complexType>
</xs:element>
<xs:element maxOccurs="unbounded" name="score">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="scoreGoal">
<xs:complexType>
<xs:attribute name="goal" type="xs:string" use="required" />
<xs:attribute name="value" type="xs:boolean" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="points" type="xs:int" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
PS。我很欣赏元素名称scoreGoal
可能不是最佳选择,但我对您的数据结构所代表的内容一无所知,所以您可能想给它一个正确的名称。