使用 xsd 模式将 xml 数据中的字符列入黑名单

Sai*_*sha 5 c# regex xml xsd pattern-matching

我想这是一个基本问题,但这种模式对我来说似乎很混乱。我想将一些字符列入黑名单,例如 +、-、@、#、<、>。如果字符在 xml 字段中,那么我想使 xml 无效。

在下面的示例中,如果字符串字段包含上述任何字符,我想将 xml 返回为无效。如果数据是这样的“你好”。它应该是有效的。我应该如何写我的模式。感谢您检查这一点。

XML:

<DataType>System.String</DataType>
<Value>
      <String>Data@yours</String>
</Value>
Run Code Online (Sandbox Code Playgroud)

在 XSD 中:

<xs:element name="Value">
<xs:complexType>
<xs:sequence>
<xs:element name="String" type="xs:string" />
</xs:sequence>
<xs:restriction base="xs:string">
<xs:pattern value="[^+-@#%&()<>?]"/>
</xs:restriction>
</xs:complexType>
</xs:element>
Run Code Online (Sandbox Code Playgroud)

进一步编辑这部分:

我一直收到这些错误:解析 EntityName 时发生错误。- 在我的代码中,实体名称必须紧跟在唯一的 xsd 验证器工具中实体引用中的 & 之后。http://www.utilities-online.info/xsdvalidation/#.VzTwcYSDFBc

它似乎没有遵循这些特殊字符,我该如何更改?再次感谢。

Wik*_*żew 2

请注意,根据。到正则表达式.info

特别值得注意的是完全没有像插入符号和美元符号、单词边界和环视等锚点。 XML 模式总是隐式地锚定整个正则表达式正则表达式必须匹配整个元素,该元素才被视为有效。

因此,要匹配不包含+, @, #, %, &, (, ), <, >, ?, -(至少 1 个符号)的字符串,您需要使用

<xs:pattern value="[^+@#%&amp;()&lt;&gt;?-]+"/>
Run Code Online (Sandbox Code Playgroud)

请注意<, ,>&应该实体化以在 XML 属性值中使用。

如果你想允许空值,*应该使用 代替+。请注意,将其-放在模式的末尾,以免创建任何如下所示的范围:

在此输入图像描述