c# - XmlReader XSD 验证在带有 _ 的电子邮件正则表达式上失败
问题描述
我们的 XSD 中有以下正则表达式模式
<xsd:restriction base='xsd:string'>
<xsd:pattern value='([\w\-\.]+)@(([\w]+\.)+)([a-zA-Z]{2,15})'/>
</xsd:restriction>
并针对它进行标准的 .Net XSD 验证。
var validationErrors = new List<string>();
// Set the validation settings.
var settings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
Schemas = schemaSet
};
settings.ValidationEventHandler += (sender, e) => {
validationErrors.Add(e.Message);
};
// Create the XmlReader object.
var xmlString = AsString(input);
var sr = new StringReader(xmlString);
using (var reader = XmlReader.Create(sr, settings))
{
// Parse the file.
while (reader.Read()) ;
}
if (validationErrors.Any())
{
throw new ValidationException(validationErrors.ToArray());
}
根据 xsd 验证将其声明为无效的正则表达式,电子邮件 your_name@mydomain.com 是有效的电子邮件。删除 _ 时,它可以工作。
我无法更改正则表达式模式,因为它是我们必须使用的外部 xsd。我无法找到此问题的根源或解决方法。
解决方案
这似乎是 XML 验证的已知问题
通过捕获验证回调并执行手动正则表达式检查来解决它:
XDocument doc = XDocument.Parse(xmlString);
doc.Validate(schemaSet, (o, e) =>
{
var elem = o as XElement;
if(elem != null && elem.Name.LocalName.Equals("email"))
{
var regex = @"([\w\-\.]+)@(([\w]+\.)+)([a-zA-Z]{2,15})";
var match = Regex.Match(elem.Value, regex, RegexOptions.IgnoreCase);
if (!match.Success)
{
validationErrors.Add(e.Message);
}
}
else
{
validationErrors.Add(e.Message);
}
});
if (validationErrors.Any())
{
throw new ValidationException(validationErrors.ToArray());
}
推荐阅读
- java - 使用通用参数会引发错误
- javascript - 嵌套 for 循环。第二个循环不识别第一个循环变量
- javascript - 如何使用我正在使用的代码避免除法计算输出余数,即 4.333333
- javascript - 像在 Android 中一样反应图形导航
- python - 从 Python/Pandas 导入数据帧时,SQL 会产生常量错误:SQL 错误 [42P01]:错误:关系“表”不存在
- php - 如何在 woo 购物车页面中显示产品变体图像?
- reactjs - 仅显示一个标记反应图 gl 的弹出窗口
- java - 如何发送我的 SAML 2.0 响应以验证与服务提供商的通信?
- java - 如何在Java中找到InputStream中的数字总和
- mockito - 何时使用 Spring Boot 测试以及何时使用 Mockito?