.net中标准xml模式(xsd)类型的自定义验证

本文关键字:类型 自定义 验证 xsd 标准 xml 模式 net | 更新日期: 2023-09-27 18:16:15

我遇到的问题是:

  1. 我有很多由第三方生成的XSD文件来检查文件类型的一致性
  2. 他们使用标准类型(即gYeardate),而没有意识到它们的真正限制
  3. 他们也使用硬编码的检查,有更多的限制,然后在XSD中使用的这些标准类型(即,空格之前或之后的数字为gYear是ok的,但将失败在他们的一边)
  4. 更改模式确实不是一种可行的方法(xsd数量众多且经常更新)
所以,这里有一个问题:我能做些什么来执行更严格的规则来验证一些标准类型?我使用。net 3.5 (c#),我们有一个围绕标准XmlReader的包装器,所以使用第三方项目根本不是一个选择。我考虑过用一些预定义类型加载额外的模式文件,这些类型将扩展/覆盖所需的类型,以某种方式捕获所需类型验证节点的时刻,并且我可以窥视所述节点的值,但我不确定如何继续。

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

.net中标准xml模式(xsd)类型的自定义验证

嗯,就我所知,这个问题真的没有简单的解决办法。

我能想到的最好的办法是在读取模式时修改它,把它放入缓存。

我只是删除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,因此您不能继承更合适的类型,如gYear, shortdecimal