【问题标题】:Schema Issue: Can define element type OR add element attribute, but not both. I want both!架构问题:可以定义元素类型或添加元素属性,但不能同时定义两者。我两个都想要!
【发布时间】:2010-12-15 15:35:25
【问题描述】:

我继承了为一些已经存在的 XML 创建模式的任务 - 恕我直言,这并不是最好的。给我带来问题的部分是“扫描结果”元素末尾的元素。

对于“频谱”元素中的数据,我最希望的是将其视为 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”元素类型定义为“xs:string”的“spectrum”元素找到有效的定义。

我想要的是如下内容:

<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”异或我可以在“spectrum”元素中定义匿名“xs:complexType”,这样我就可以插入“count” ' 属性。但我需要能够同时表达两者。

鉴于我在收到 XML 时有点卡住,是否有允许我描述这些数据的架构定义?

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

报警器

跟进:我知道为什么会出现错误...

引自 W3C:

3.3.3 元素声明的 XML 表示的约束 Schema 表示约束:元素声明表示 OK

除了模式对元素信息项施加的条件之外:以下所有条件都必须为真: 1 default 和 fixed 不能同时存在。 2 如果项目的父项不是 ,则以下所有条件都必须为真: 2.1 ref 或 name 之一必须存在,但不能同时存在。 2.2 如果 ref 存在,那么所有 , , , , , nillable, default, fixed, form, block 和 type 都必须不存在,即除了 ref 之外,只允许 minOccurs、maxOccurs、id 以及 . 3 类型和其中一个或是互斥的。 4 相应的粒子和/或元素声明必须满足元素声明架构组件的约束(§3.3.6)和粒子架构组件的约束(§3.9.6)中规定的条件。

但我仍处于与之前相同的状态...我如何才能真正完成与我的目标相似的事情?

谢谢,

报警器

【问题讨论】:

    标签: xsd


    【解决方案1】:

    让一个工具为你做这件事!试试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>
    

    【讨论】:

    • 我正在使用 Altova 的 XML Spy 工具。
    • 尝试上面编辑的架构。我自己通过 XSD.exe 运行它:)
    • 非常接近!谢谢!以下是我正在寻找的内容...
    • 看起来与我 2 分钟前在编辑中所说的非常相似。 ://
    • 我没有意识到我可以将一段 XML 交给 XSD 并得到模式。我一直用它来将模式作为我的输入和输出代码。
    【解决方案2】:
    <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>
    

    【讨论】:

      【解决方案3】:

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

      <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>
      

      【讨论】:

      • 已经尝试过了,但是因为被拒绝了,所以懒得在示例中发布它。我疏忽了,没有提到 XML Spy 工具给了我以下消息:“对于元素声明 'spectrum','type' 属性和匿名类型定义是互斥的。”这也可能让其他人对解决方案有所了解。
      • 是的,类似! +1。我从 xsd.exe 中删除了一些内容,例如“ " 以避免混淆 OP 作者。
      猜你喜欢
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2022-12-04
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多