如何在.Net中使用其他/更现代的模式验证?

时间:2010-02-28 20:50:45

标签: c# .net xml schema relaxng

我正在尝试在跨平台应用程序中使用C#和XML(大多数开发都在Linux上的MonoDevelop中,但大多数用户最终会使用我在Visual Studio中创建的WinForms前端)。 Mono表现得像我期望的那样,但.Net不是,所以我正在寻找选择和替代方案。

模式有各种可选元素,后跟“xs:any”元素。这在Mono中完全正常,但在微软的.Net中却没有,因为它抱怨可选元素的出现在它在模式中的实际定义和“xs:any”之间是模糊的。从一点阅读开始,它似乎是在W3C的Schema定义的更高版本中解决的问题。显然,Mono一直保持最新,但微软却落后了。

我能看到的选项是:

1)使用RelaxNG - 遗憾的是,从主站点到C#实现的链接被破坏了。它是Mono的一部分,但在MS'.Net上运行时没有多大帮助。我能看到的唯一方法是复制并重建Mono's version作为我自己的DLL

2)使用Schematron - 我发现它是关于制作向后和向前兼容XML的建议,但它似乎更像是格式验证器而不是“标准”模式语言。我不太确定实现的位置 - 我能找到的只是一个命令行验证器。

3)确保MS .Net实现使用Mono使用的更新架构标准 - 我甚至不知道这是否可行。

4)坚持使用丑陋的模式,并将“xs:any”放在可选的“扩展”元素中 - 除了官方的.Net框架之外没有任何其他理由,它不会混淆,但它可以工作。

代码针对.Net 2.0,但我的机器上安装了3.5。我也在使用Mono 2.4,MonoDevelop 2.2和Visual Studio Express 2005。

1-3中的任何一个是可能的,还是我坚持使用4?

感谢。

2 个答案:

答案 0 :(得分:4)

您可以通过将XmlSchemaSet.CompilationSettings.EnableUpaCheck设置为false来解决歧义问题。 UPA代表您引用的XML Schema标准的Unique Particle Attribution要求。

答案 1 :(得分:0)

我为在C#中实现的ISO schematron的复活做出了贡献。它可以在github here上找到。