2012-11-02 26 views
2

我有一个2部分的问题:如何在C#中使用XML模式正则表达式?

  1. 我怎样才能得到一个XSD面的regex表达,然后用它来确定一个字符串的限制相匹配?在我看来,这是“如何将XML Schema正则表达式转换为.NET Regex”,但如果您有另一种方式让我除了转换表达式之外,还可以提供建议。

  2. 如果测试(#1)失败,我怎样才能使用XSD模式regex自动创建一个满足约束的字符串?

+0

您无法使用正则表达式使用XML(可靠地)。你能提供更多的细节,比如你想做什么样的验证或正则表达式分析? – Dai

+0

从XSD获取正则表达式(例如,),并在.NET中使用它一个正常的字符串值(“ABC”)。 – gap

+0

为什么不直接根据模式验证XML? –

回答

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

    由于正则表达式“方言”不同,我会建议您不要在评论中提出您的建议。

  2. 我不知道这样的事情,免费或其他。我确信它可以完成,但我从来没有找到能够真正起作用的东西,当我自己需要时。如果你确实找到一个,请分享。

+0

这看起来很有希望!我会尝试查看它是否适用于我的应用程序。你知道继承的模式方面是否适用于XmlSchemaDatatype.ParseValue吗? – gap

+0

是的,他们应该。 –

1

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

基本上你需要用诸如\ p {_xmlC}和\ P {_xmlD}的.NET替代品替换\ c和\ D等少数模式。

此外,您还需要在^和$标记中包装表达式。

.NET中方法预处理在https://github.com/Microsoft/referencesource/blob/master/System.Xml/System/Xml/Schema/FacetChecker.cs

如果您决定复制粘贴的实施,要注意实现这一点,虽然。

您需要

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

更换循环

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

因为优化的原因预处理假定输入表达式用括号括起来。