是否需要针对XSD严格验证XML?如何在XSD中验证基于条件的XML?
我有一个需要验证条件的场景。经过一些研究后,我发现XSD 1.0不会进行基于条件的验证。
示例:基于属性' Y'或者' N',我必须显示不同的元素。
请提供任何建议。
答案 0 :(得分:1)
考虑以下设计:在我们的A
元素中,我们有frob
属性,其值为'Y'或值'N'。如果frob='Y'
,则A
必须包含B
,C
,以及D
的零次或多次出现;如果frob='N'
,则A
的内容为X
,Y
,Z
。正如您所说,XSD 1.0无法强制frob
属性与A
内容的一致性。
现在考虑以下设计:A
元素包含B
和C
,后跟零个或多个D
,或者X
,按此顺序Y
和Z
。 XSD 1.0可以非常简单地表达这种设计。
对于与第一个设计相对应的每个XML实例,都有一个对应第二个设计正确的实例,反之亦然。换句话说,这两个设计包含完全相同的信息。
在这种情况下,我的建议是问自己,为什么你想要多余的frob
属性,因为它没有传达A
内容尚未传达的有用信息。
答案 1 :(得分:1)
不,XML不必针对XSD进行验证。
XSD 1.0无法对您的数据强制执行任意约束。如果你有使用XSD 1.0无法强制执行的约束,你有很多选择:重新设计XML,转移到XSD 1.1,使用不同的技术验证它(包括编写你自己的自定义验证器的选项,比如在XSLT中),或者根本不验证它。