我继承了为已经存在的某些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
答案 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>