【问题标题】:XSD for element with required attribute and required subelement具有必需属性和必需子元素的元素的 XSD
【发布时间】:2016-04-01 18:06:06
【问题描述】:

客户要求(我无法理解)我们向他发送 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 的字符串类型的属性
  4. 该元素将有一个名为 VALUE 的字符串类型的子元素
  5. VALUE 子元素可能有也可能没有值。

我还没有创建 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

【问题讨论】:

    标签: xml xsd


    【解决方案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>
    

    【讨论】:

    • 是的,我对那个设计的反应是问我的老板,公司是否愿意付钱让我飞到客户的网站上,然后拍一些白痴的脑袋。不幸的是,他拒绝了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2015-10-23
    相关资源
    最近更新 更多