在.net中自定义标准xml架构(xsd)类型的验证

时间:2011-12-01 14:01:25

标签: c# .net validation xsd

我遇到的问题是:

  1. 我有很多第三方生成的XSD文件来检查文档类型的一致性
  2. 他们使用标准类型(即gYeardate)而未实现其真正的限制
  3. 他们还使用硬编码检查,这些检查比XSD中使用的这些标准类型具有更多限制(即,gYear的数字之前或之后的空格都可以,但是会在他们身边失败)< / LI>
  4. 改变架构实际上不是一种可行的方法(XSD很多且经常更新)
  5. 所以,问题在于:我可以采取哪些措施来强制执行更严格的规则来验证某些标准类型? 我使用.NET 3.5(C#),我们有一个标准XmlReader的包装器,因此使用第三方项目根本不是一个选项。 我考虑使用一些预定义类型加载其他模式文件,这些类型将扩展/覆盖所需类型,以某种方式捕获所需类型验证节点的时刻,我可以查看所述值的值节点,但我不确定如何继续。

    附加要求:验证过程应该是流式传输(即没有XmlDocument等)。

1 个答案:

答案 0 :(得分:0)

嗯,据我所知,这个问题确实没有任何简单的解决办法。

我能想到的最好的方法是在读取模式时将其修改为缓存。

我只需删除type="xs:gYear"并添加<simpleType>子元素(如果需要):

    <xs:simpleType>
            <xs:restriction base="xs:string">
                    <xs:pattern value="^(19|2\d)\d{2}$" />
            </xs:restriction>
    </xs:simpleType>

幸运的是,我们拥有将验证错误转换为人类可读错误的基础架构,因此不应混淆实际架构与这些元素的验证错误之间的差异。

另外,值得注意的是,XML Schema中的每个类型都将facet whiteSpace设置为collapse,因此您无法继承更合适的类型,例如gYearshortdecimal