繁体   English   中英

XSD-任何(未知)元素的未绑定数目,但定义了序列中的最后一个元素

[英]XSD - unbound number of any (unkown) elements but last element in sequence is defined

是否可以使用一个或多个XSD来验证以下xml结构

<container>
    <unkownA />
    <unkownB />
    <unkownC />
    ...
    <data />
</container>

根据那些规则

  1. 有无限数量的未知元素
  2. 至少有这些未知的元素之一
  3. 最后一个元素是数据
  4. 数据仅发生一次
  5. 根据提供的规则验证数据

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM