[英]XSD - unbound number of any (unkown) elements but last element in sequence is defined
是否可以使用一个或多个XSD来验证以下xml结构
<container>
<unkownA />
<unkownB />
<unkownC />
...
<data />
</container>
根据那些规则
xml中的所有元素都具有相同的名称空间(“”) ,我们无法更改。 尽管我知道这可能是最简单的解决方案,但我们很可能也无法更改元素的顺序 。 通常,更改xml是不可行的选择,因为它是由我们无法控制的外部系统生成的。
我尝试过这样的事情
<xs:sequence>
<xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax" />
<xs:element ref="data" minOccurs="1" />
</xs:sequence>
当然,哪个模棱两可违反了“唯一粒子归因”。
在这里,我还了解了使用第二个命名空间的知识。 创建一个“灵活的” XML模式,但是由于我们无法更改xml,因此这似乎不是解决方案,或者我显然不正确地理解它。
通过使用Java处理xml / xsd,xsd 驻留在类路径中 ,因此从xsd内部导入xs:import可能是一个问题。
如果答案是“在这些限制内使用xsd无法完成”,那么我很好。
有什么想法吗?
您尝试的模式在XSD 1.1中有效-使用最新版本的Saxon或Xerces,再试一次。
如果至少知道您希望在容器类型中使用的类型的名称,则可以将其命名为xs:anyType类型。 但是您需要知道可能的类型名称的列表,否则定义它们的模式的意义是什么?
更新:我不正确,您可以将容器设置为<xs:any/>
但这将阻止您指定容器中必须有一个<data />
元素。
终于奏效了,即使这并不令我高兴:
javax.xml.validation.SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory
.setFeature(
"http://apache.org/xml/features/validation/schema-full-checking",
false);
这似乎禁用了架构本身的验证。 xml的验证按预期并如上所述进行。 是的,我知道:禁用默认情况下处于活动状态的安全/完整性功能可能不是一个好主意。 但是直到知道没有时间找到更好的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.