分号在XSD中分隔的类型列表

时间:2015-03-23 17:56:16

标签: regex xml visual-studio visual-studio-2013 xsd

我有一个XML属性,必须接受以分号分隔的字符串列表。我想创建一个XSD来指定该输入的所有可能值。

例如:

<User role="Admin;Publisher;Editor" />

我知道我可以像这样创建一个简单的类型:

<xs:attribute name="role">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:enumeration value="Admin"/>
      <xs:enumeration value="Editor"/>
      <xs:enumeration value="Proofreader"/>
      <xs:enumeration value="Publisher"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

但这限制了它只有一个值。

我知道我也可以使用正则表达式。但是我如何将两者结合起来呢?如果我使用像[^;]+这样的正则表达式,那么我该如何验证这些值呢?

我可以创建一个列出那些role枚举的正则表达式吗?

或者只是一个正则表达式,强制它成为这些枚举值的列表,以任何顺序,中间用分号? (A;C;BA;B;A等,其中ABC是指定的字词。)

2 个答案:

答案 0 :(得分:0)

可能这样做,但不可取。您可以提出枚举所有可能组合的限制,例如:

<xs:enumeration value="Admin;Editor;Proofreader;Publisher" />
<xs:enumeration value="Admin;Editor;Proofreader" />
<xs:enumeration value="Admin;Editor" />

等。会有很多排列,当你继续添加更多角色时,列表会呈指数级增长。

您真正应该考虑的是重构您的XML和架构,使其更像以下内容:

<User>
  <role>Admin</role>
  <role>Editor</role>
</User>

如果你真的坚持仍然使用属性,你可以在role元素上抛出属性,如果你想指定角色元素的子元素而没有混合内容节点,那么这个属性可能很有用:

<User>
  <role name="Admin"><roleDescription>An administrator of the system</roleDescription></role>
  <role name="Editor"><nodesICanEdit>All</nodesICanEdit></role>
</User>

答案 1 :(得分:0)

Dan Field的回答是正确的:正确的做法是修复XML的设计。

如果你不能这样做(为什么不呢?你怎么参与一个破解设计被冻结的项目才能修复?你真的想参与这个项目吗?),简单解决方法是在验证之前将数据从指定格式转换为更容易验证的格式。

  • 根据Dan Field的建议,您可以在小时候拥有role

    <User>
      <role>Admin</role>
      <role>Editor</role>
    </User>
    

    此处,'role'的类型与样本中匿名类型的@role相同。

  • 您可以将角色作为元素:

    <User>
      <Admin/>
      <Editor/>
    </User>
    

    此处,xs:all可用于允许可选角色元素以任何顺序出现。

  • 您可以使用以空格分隔的角色名称列表:

    <xs:simpleType name="rolename">
      <xs:restriction base="xs:string">
        <xs:enumeration value="Admin"/>
        <xs:enumeration value="Editor"/>
        <xs:enumeration value="Proofreader"/>
        <xs:enumeration value="Publisher"/>
      </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="rolelist">
      <xs:list itemType="tns:role"/>
    </xs:simpleType>