Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex XSD中以分号分隔的类型列表_Regex_Xml_Visual Studio_Visual Studio 2013_Xsd - Fatal编程技术网

Regex XSD中以分号分隔的类型列表

Regex XSD中以分号分隔的类型列表,regex,xml,visual-studio,visual-studio-2013,xsd,Regex,Xml,Visual Studio,Visual Studio 2013,Xsd,我有一个XML属性,它必须接受以分号分隔的字符串列表。我想创建一个XSD来指定该输入的所有可能值 例如: <xs:enumeration value="Admin;Editor;Proofreader;Publisher" /> <xs:enumeration value="Admin;Editor;Proofreader" /> <xs:enumeration value="Admin;Editor" /> 我知道我可以创建这样一个简单的类型: 但这将其限

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

例如:

<xs:enumeration value="Admin;Editor;Proofreader;Publisher" />
<xs:enumeration value="Admin;Editor;Proofreader" />
<xs:enumeration value="Admin;Editor" />
我知道我可以创建这样一个简单的类型:

但这将其限制为仅一个值

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

我可以制作一个正则表达式来列出这些角色枚举吗


或者仅仅是一个正则表达式,强制它是一个枚举值列表,以任何顺序排列,中间有分号?A.CB、 A;BA、 etc,其中A、B和C是指定的单词。

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

<xs:enumeration value="Admin;Editor;Proofreader;Publisher" />
<xs:enumeration value="Admin;Editor;Proofreader" />
<xs:enumeration value="Admin;Editor" />
等等。会有很多的排列,随着你继续添加更多的角色,列表将呈指数增长

<> P>你真正应该考虑的是重构XML和模式,使其更类似于:

<User>
  <role>Admin</role>
  <role>Editor</role>
</User>
如果您确实仍然坚持使用属性,则可以将该属性扔到role元素上,如果您希望指定role元素的子元素而不具有混合内容节点,这可能会很有用:

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

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

如果你做不到,为什么不呢?你究竟是如何参与到一个项目中去的,一个破碎的设计在修复之前就被冻结了?您真的想参与此项目吗?一个简单的解决方法是在验证之前将数据从指定格式转换为更易于验证的格式

正如Dan Field所建议的,您可以扮演孩子的角色

<User>
  <role>Admin</role>
  <role>Editor</role>
</User>
这里,“角色”的类型与示例中的匿名类型@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>

是否可以重构您的模式设计,使角色成为一个重复元素?如果可能的话,这将是一个更好的设计。或者,您可以将属性拆分为类似IsAdmin、IsEditor等的内容。但在我看来,重复元素仍然更可取。不幸的是,我无法更改模式,它被锁定为分号分隔的列表。我同意您关于重构架构以拥有子集合而不是此属性列表的观点,但不幸的是,我现在无法更改结构。相信我,我希望更改架构。但是要验证它,一个简单的模式比XSD更重要。这和咨询都是关于选择你的战斗。