0

我有一个包含如下内容的 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+F)。

分数必须根据我无法控制的规则计算;例如,改变目标的定义方式不是一种选择。我唯一的灵活性是 XML 的结构。有人可以建议一种将给定结构编码为 XML 的方法,以便可以使用 XML Schema 进行验证?

4

1 回答 1

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可能不是最佳选择,但我对您的数据结构代表什么一无所知,因此您可能想给它一个合适的名称。

于 2013-10-24T09:41:44.670 回答