如何在C#中使用XML Schema正则表达式?

时间:2012-11-02 02:25:41

标签: c# regex xsd

我有两个问题:

  1. 如何获取regex方面的XSD表达式,然后使用它来确定字符串是否与限制匹配?在我看来,这是“我如何将XML Schema正则表达式转换为.NET Regex”,但如果除了转换表达式之外你还有另一种方式可以做我的建议,我愿意接受建议。

  2. 如果测试(#1)失败,我如何使用XSD模式regex自动创建满足约束条件的字符串?

2 个答案:

答案 0 :(得分:2)

  1. XmlSchemaDatatype.ParseValue是您的答案。假设关联的简单类型具有更多方面,并且您只想针对模式1进行验证,那么您必须在XmlSchemaSimpleTypeRestriction.Facets中简单地找到枚举方面,使用它的副本来创建新的XmlSchemaSimpleType,使用您上面挖出的值,使用新的XmlSchemaSimpleTypeRestriction Content和新的pattern facet(s)。然后使用这个新创建的简单类型,调用XmlSchemaDatatype.ParseValue。

    我会在评论中反对你的建议,因为正则表达式“方言”是不同的。

  2. 我不知道有这样的事情,可以免费或其他方式获得。我确信它可以做到,但是当我自己需要的时候,我从来没有找到真正有效的东西。如果你找到了,请分享。

答案 1 :(得分:1)

将XML Schema正则表达式转换为.NET正则表达式并不太困难。

基本上,您需要使用\ p {_xmlC}和\ P {_xmlD}之类的.NET替代品替换少量模式,例如\ c和\ D..

此外,您需要将表达式包装在^和$ markers中。

.NET在https://github.com/Microsoft/referencesource/blob/master/System.Xml/System/Xml/Schema/FacetChecker.cs

中的方法Preprocess中实现了这一点

如果您决定复制粘贴实现,请小心。

您需要替换循环

for (int position = 0; position < length - 2; position ++)

for (int position = 0; position < length - 1; position ++)

因为出于优化原因,Preprocess假定输入表达式括在括号中。