XML Schema验证无法验证从正则表达式字符串样本生成器

时间:2015-07-28 09:15:27

标签: c# regex xsd xsd-validation

我无法通过特定元素的xsd验证。

在显示我的代码之前,请注意第三方收到的xsd,并且我被迫坚持使用,不做任何更改。

问题:对于给定元素,xsd正则表达式验证模式失败,并带有消息

The value '...' is invalid according to its datatype 'String' - The Pattern constraint failed.

现在,模式非常冗长且复杂到足以让我不断尝试理解它并使用正则表达式样本字符串生成器。

作为这样的例子,我确实使用了以下内容:

1 即可。 http://uttool.com/text/regexstr/default.aspx

2 即可。 https://github.com/moodmosaic/Fare(C#)

在使用上述工具验证自动生成的样本时,我使用了http://www.regexr.com/

我没有找到一个自动生成的样本,其中regexr.com没有将其确认为匹配。

然而,我的架构验证失败了。

我创建了一个代码示例来说明问题:

XSD

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="MyField">
    <xsd:annotation>
      <xsd:documentation>
        MyField Display Text
      </xsd:documentation>
    </xsd:annotation>
    <xsd:simpleType>
      <xsd:restriction base="xsd:string">
        <xsd:pattern value="([0-9]\d{3}((0[1-9]|1[012])(0[1-9]|1\d|2[0-8])|(0[13456789]|1[012])(29|30)|(0[13578]|1[02])31)|(15(8[48]|9[26])|(1[6-9]|[2-9]\d)(0[48]|[13579][26]|[2468][048])|([2468][048]|16|3579[26])00)0229)((0[0-9]|1[0-9]|2[0-3])([0-5]\d){2})" />
      </xsd:restriction>
    </xsd:simpleType>
  </xsd:element>
</xsd:schema>

XML

<?xml version="1.0" encoding="utf-8" ?>
<MyField>
  62710522201745
</MyField>

验证码

string xsdTestMarkup = File.ReadAllText(GetPath("TestSchema.xsd"));
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", XmlReader.Create(new StringReader(xsdTestMarkup)));

DirectoryInfo filesFolder = new DirectoryInfo("...myPath...");
FileInfo[] files = filesFolder.GetFiles("*.xml", SearchOption.TopDirectoryOnly);

List<XDocument> xmlDocs = new List<XDocument>();

foreach (FileInfo file in files)
{
    xmlDocs.Add(XDocument.Load(file.FullName));
}

for(int i = 0; i < xmlDocs.Count; i++)
{
    Console.WriteLine("Validating file [{0}]...", files[i].Name);
    List<string> errors = new List<string>();
    xmlDocs[i].Validate(schemas, (o, e) =>
    {
        errors.Add(e.Message);
    });

    File.WriteAllLines(GetPath("ValidationErrors" )+ Path.GetFileNameWithoutExtension(files[i].Name) + ".txt", errors);
}

这里有什么问题?它是验证本身吗?我在这个 xsd 中使用“pattern”进行了几次其他验证(使用不同的模式),它们都没有问题。

1 个答案:

答案 0 :(得分:1)

在没有空格的情况下尝试一下。似乎工作正常。

另请注意,XSD中使用的正则表达式规则与标准正则表达式规则略有不同,我认为在这种情况下它没有任何区别,但值得了解。

<?xml version="1.0" encoding="utf-8" ?>
<!-- Created with Liquid XML 2015 Designer Edition (Trial) 13.1.0.5909 (http://www.liquid-technologies.com) -->
<MyField>62710522201745</MyField>