在我的XML Schema

时间:2017-12-26 20:03:03

标签: xml xsd xsd-validation

我为我之后制作的所有XML设计了一个XSD架构。我知道我应该先做这件事,但我对它有点新意。到目前为止,我的所有XML都为我的应用程序创造了奇迹,我只想对它进行一些很好的验证。

这是我想要的一个简单例子。



<fields>
  <field id="name" type="text">
  	<display>Somethings Name</display>
  	<description>The name of the something.</description>
  </field>
</fields>
<forms>
  <form id="custom_form">
    <widgets>
      <widget type="text-input">
        <field id="name"/>
      </widget>
    </widgets>
  </form>
</forms>
&#13;
&#13;
&#13;

以下是我所拥有的XSD的简化示例:

&#13;
&#13;
<xs:sequence>
  <xs:element name="fields" minOccurs="1" maxOccurs="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="field" type="fieldType"
          minOccurs="1" maxOccurs="unbounded">
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="forms" maxOccurs="1" minOccurs="1">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="form" minOccurs="0" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="widgets" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="widget" minOccurs="1" maxOccurs="unbounded">
                      <!-- What do I put here to reference a field? -->
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:sequence>
&#13;
&#13;
&#13;

我的主要问题是如何告诉XSD架构widget节点中的元素是对其上方fields节点中定义的字段之一的引用?现在我只是使用代码进行验证。

如何在此场景中定义字段节点?我应该简单地定义field节点两次,一个用于主要定义,一个用于引用小部件节点中的字段?

我还看到了可以选择在XSD中重新定义节点。我是否可以定义主field定义然后将其重新定义为小部件的引用样式节点?我怎么会这样做?

对于此方案的常见或流行的任何建议?

1 个答案:

答案 0 :(得分:1)

您可以使用XML Schema key / keyref构造将属性的可能值约束为文档中其他位置的一组属性中使用的值。请参阅XML Schema key/keyref - how to use them?以及答案中的使用示例链接,忽略JAXB细节。