架构问题:可以定义元素类型或添加元素属性,但不能同时定义两者。我想要两个!

时间:2009-11-11 21:30:11

标签: xsd

我继承了为已经存在的某些XML创建模式的任务 - 而恕我直言并不是最好的。给我提问的部分是'scan-result'元素末尾的元素。

关于'spectrum'元素中的数据,我希望最好的是将其视为type =“xs:string”。我将以编程方式将稍后构成字符串数据的数字对进行划分。 (即使首先正确构建数据,也不需要这一步。)

这是我必须使用的类似XML数据...

    <scan-result>
      <spectrum-index>0</spectrum-index>
      <scan-index>2</scan-index>
      <time-stamp>5609</time-stamp>
      <tic>55510</tic>
      <start-mass>22.0</start-mass>
      <stop-mass>71.0</stop-mass>
      <spectrum count="5">30,11352;31,360;32,16634;45,1161;46,26003</spectrum>
    </scan-result>

问题是,我似乎无法获得具有'count'属性的'spectrum'元素的工作定义,并允许我将'spectrum'元素类型定义为“xs:string”。

我想要的是以下内容:

<xs:complexType name="ctypScanResult">
    <xs:sequence>
        <xs:element name="spectrum-index" type="xs:integer"/>
        <xs:element name="scan-index" type="xs:integer"/>
        <xs:element name="time-stamp" type="xs:integer"/>
        <xs:element name="tic" type="xs:integer"/>
        <xs:element name="start-mass" type="xs:float"/>
        <xs:element name="stop-mass" type="xs:float"/>
        <xs:element name="spectrum" type="xs:string">
            <xs:complexType>
                <xs:attribute name="count" type="xs:integer"/>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
    <xs:attribute name="count" type="xs:integer"/>
</xs:complexType>

问题在于我可以将'spectrum'元素的类型定义为“xs:string”XOR我可以在'spectrum'元素中定义匿名'xs:complexType',这允许我插入'count' '属性。但我需要能够表达两者。

鉴于我在向我提交XML时遇到困难,是否有一个架构定义可以让我描述这些数据?

对不起,这很长,但感谢所有回复者,

AlarmTripper

跟进:我知道错误发生的原因......

引自W3C:

3.3.3元素声明的XML表示的约束 模式表示约束:元素声明表示确定

除了模式的模式对元素信息项施加的条件之外:以下所有条件都必须为真: 1默认和固定不得同时存在。 2如果项目的父项不是,则必须满足以下所有条件: 2.1必须存在参考号或名称之一,但不能同时存在。 2.2如果存在ref,则必须缺少所有,,,, nillable,default,fixed,form,block和type,即除了ref之外,只允许minOccurs,maxOccurs,id。 3种类型和任何一种或相互排斥。 4相应的粒子和/或元素声明必须满足元素声明模式组件约束(第3.3.6节)和粒子模式组件约束(第3.9.6节)中规定的条件。

但我仍然处于以前的修复状态......我怎样才能真正完成类似于我目标的事情呢?

谢谢,

AlarmTripper

3 个答案:

答案 0 :(得分:2)

让工具为您做到!试试xsd.exe

或者,如果您必须手动定义,至少要检查您自己生成的手写定义。

以下是XSD.exe为您输入的内容。我修剪了一些MS-NS残骸。

<xs:element name="spectrum">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="count" type="xs:string" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
</xs:element>

答案 1 :(得分:1)

您需要在mixed="true"上设置属性complexType

<xs:element name="spectrum">
  <xs:complexType mixed="true">
    <xs:attribute name="count" type="xs:integer" />
  </xs:complexType>
</xs:element>

编辑:好的,请阅读您的评论,抱歉。我相信以下内容应该有效:

<xs:element name="spectrum">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="count" type="xs:integer" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

答案 2 :(得分:1)

<xs:element name="spectrum" type="xs:string">
  <xs:complexType>
    <!-- ADD THIS NEXT LINE -->
    <xs:complexContent mixed="true"/>
    <xs:attribute name="count" type="xs:integer"/>
  </xs:complexType>
</xs:element>