验证XML - 让一个属性为其他属性定义有效名称

时间:2013-10-22 16:28:28

标签: xml xsd

我有一个包含这样的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进行验证吗?

1 个答案:

答案 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可能不是最佳选择,但我对您的数据结构所代表的内容一无所知,所以您可能想给它一个正确的名称。