具有必需属性和必需子元素

时间:2016-04-01 18:06:06

标签: xml xsd

客户要求(无论我无法理解)我们向他发送的XML文件部分包含:

<ANNEAL>
    <CHARACTERISTIC NAME="CHARGE">
        <VALUE>23</VALUE>
    </CHARACTERISTIC>
    <CHARACTERISTIC NAME="POSITION">
        <VALUE>3</VALUE>
    </CHARACTERISTIC>
    <CHARACTERISTIC NAME="REANNEAL_HOLD">
        <VALUE>N</VALUE>
    </CHARACTERISTIC>
    <CHARACTERISTIC NAME="FINAL_COLDSPOT">
        <VALUE></VALUE>
    </CHARACTERISTIC>
    <CHARACTERISTIC NAME="FINAL_HOTSPOT">
        <VALUE/>
    </CHARACTERISTIC>
</ANNEAL>

我正在尝试创建一个名为CharacteristicType的XSD类型,它需要以下内容:

  1. 元素的名称为CHARACTERISTIC
  2. 元素没有价值
  3. 该元素将只有一个名为NAME的属性为string
  4. 的属性
  5. 该元素将有一个名为VALUE的字符串
  6. 的子元素
  7. VALUE子元素可能有也可能没有值。
  8. 我还没有创建Visual Studio喜欢的类型定义。这是我最近的尝试:

      <xs:complexType name="DateCharacteristicType">
        <xs:sequence>
          <xs:element name="cname">
            <xs:complexType>
              <xs:sequence>
                <xs:element type="xs:dateTime" name="VALUE"/>
              </xs:sequence>
                <!--<xs:restriction base="xs:string">
                  <xs:enumeration value="CHARACTERISTIC"/>
                </xs:restriction>-->
              <xs:attribute type="NonEmptyString" name="NAME"/>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    

    我确定我必须使用单元素枚举来将外部元素的名称限制为CHARACTERISTIC。或者我会吗?想一想,它必须应用于元素的值,而不是它的名称。我想我必须在要求1上妥协,并且必须自己命名每个元素CHARACTERISTIC

1 个答案:

答案 0 :(得分:1)

那可怕的XML设计,但无论如何......

  • 必填元素:使用minOccurs="1"(或默认省略)。
  • 必需属性:使用use="required"

XSD

根据要求提供XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified">
  <xs:element name="ANNEAL">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="CHARACTERISTIC" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="VALUE" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="NAME" use="required" type="xs:NCName"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>