【问题标题】:Blacklist characters in xml data using xsd pattern使用 xsd 模式的 xml 数据中的黑名单字符
【发布时间】:2016-05-12 19:57:56
【问题描述】:

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

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

XML:

<DataType>System.String</DataType>
<Value>
      <String>Data@yours</String>
</Value>

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

进一步编辑这部分:

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

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

【问题讨论】:

  • 只是想一想,如果那里的正则表达式应该匹配 valid 字符串,不应该是[^+-@#%&amp;()&lt;&gt;?]+吗?

标签: c# regex xml xsd pattern-matching


【解决方案1】:

请注意,acc。致regular-expressions.info

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

所以,要匹配一个不包含+@#%&amp;amp;()&amp;lt;&amp;gt;、@的字符串987654334@,-(至少1个符号),需要用到

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

请注意,&amp;lt;&amp;gt;&amp;amp; 应实体化以在 XML 属性值中使用。

如果要允许空值,应使用* 而不是+。请注意,- 放在模式的末尾,以免创建任何这样的范围:

【讨论】:

  • 感谢您的建议。我一直在尝试实施相同的方法。但我一直收到这个错误。 - 解析 EntityName 时出错。我的语法有什么问题吗?
  • 对不起,我完全忘记了那部分。检查是否可以先使用&amp;gt;&amp;lt;。并且&amp;amp; 必须是&amp;amp;
  • 再次感谢。但是,我仍然在 xsd 验证器的在线工具上收到错误消息。 utilities-online.info/xsdvalidation/#.VzTwcYSDFBc 元素字符串既有类型属性又有匿名类型子。一个元素只允许其中一个。
  • 该链接未显示任何测试 XML/XSD。请将整个样本粘贴到问题中,以便我进行测试。
  • 很抱歉。看起来问题现在已经解决了。我在这里将类型指定为字符串两次 - 删除类型后,它工作正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多