【问题标题】:XSD: is there a way to build an enumeration from name/value pairs?XSD:有没有办法从名称/值对构建枚举?
【发布时间】:2011-07-15 22:41:50
【问题描述】:

我想在我的 XSD 中有一个枚举,它指定一组与错误代码和相关描述相对应的名称/值对。例如:

101  Syntax error
102  Illegal operation
103  Service not available

等等。我可以构建一个简单的结构 event_result 来保存它:

<xs:complexType name="event_result">
    <xs:sequence>
       <xs:element name="errorcode" type="xs:integer"/>
       <xs:element name="errormessage" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

此记录将用于异常报告记录(作为“结果”元素):

<xs:complexType name="event_exception">
    <xs:sequence>
        <xs:element name="event_id" type="xs:integer"/>
        <xs:element name="result" type="event_result"/>
        <xs:element name="description" type="xs:string"/>
        <xs:element name="severity" type="xs:integer"/>
    </xs:sequence>
</xs:complexType>

现在要注意的是,我想定义一个包含所有已知异常代码及其描述的全局枚举。理想情况下,我希望它成为 XSD 的一部分,而不是单独的 XML 数据文件。我不确定如何定义一个其成员是复杂类型的枚举 - 或者如何以其他方式实现相同的目标。在编程语言中,它是一个简单的二维数组,在 XML 中很容易,但不确定如何在 XSD 中做到这一点。

想法?提前致谢!

【问题讨论】:

    标签: xsd enumeration name-value


    【解决方案1】:

    如何使用 xsd:annotation/xsd:appinfo 元素来保存错误消息:

     <xs:simpleType name="event_result">
        <xs:restriction base="xs:string">
          <xs:enumeration value="101">
             <xs:annotation><xs:appinfo>Syntax error</xs:appinfo></xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="102">
             <xs:annotation><xs:appinfo>Illegal operation</xs:appinfo></xs:annotation>
          </xs:enumeration>
          <xs:enumeration value="103">
             <xs:annotation><xs:appinfo>Service not available</xs:appinfo></xs:annotation>
          </xs:enumeration>
        </xs:restriction>
      </xs:simpleType>
    

    【讨论】:

    • xsd 是错字还是故意的?有人建议从 xs 更改为 xsd 的编辑,但我不知道这是不是一个错误。
    • 我建议编辑,Visual Studio 2013 提示这是一个错误。看到这个帖子:stackoverflow.com/questions/7787481/…
    • 一般来说没关系,和你的 xml 声明有关。所以我建议编辑,因为这个线程中的其他所有内容都使用“xs”而不是“xsd”。
    【解决方案2】:

    我认为 xsd 本身不支持你想要的东西。我见过这样的实现:

      <xs:simpleType name="event_result">
        <xs:restriction base="xs:string">
          <xs:enumeration value="101, Syntax error"/>
          <xs:enumeration value="102, Illegal operation"/>
          <xs:enumeration value="103, Service not available"/>
        </xs:restriction>
      </xs:simpleType>
    

    【讨论】:

    • 谢谢,奥塔维奥。如果没有更好的方法,这就是我要做的……我只是希望有。 ;)
    • XSD 可以定义对单个元素的限制,但不支持(据我所知)跨元素的限制,我猜这超出了范围。但是,您可以通过建立约定并创建位置对应的单独限制来“伪造”它,以便您可以使用相同的索引来检索键和值。它只是看起来不洁净。
    • 由于条目的实际内容无论如何都会在(Ruby 或 C#)代码中处理,我可能只是使用一个简单的约定,如带有管道符号分隔符的 code|description。 Ruby 或 C# 可以使用字符串提取函数轻松地将其分开。我真的不需要 XML 来理解语义。所以这真的不是那么糟糕的方法......
    • 我同意,您甚至可以使用建立代码|描述约定的模式(正则表达式)来创建限制。
    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 2015-03-17
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2011-01-07
    • 2011-02-05
    • 2017-12-05
    相关资源
    最近更新 更多