XSD - 任何(未知)元素的无限数量,但序列中的最后一个元素是定义的

时间:2011-07-29 13:18:02

标签: java xml xsd schema

是否可以使用一个或多个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>

当然,含糊不清,违反了“独特粒子归因”。

我还在这里阅读了第二个命名空间的使用Creating a 'flexible' XML schema 但由于我们无法更改xml,这似乎不是一个解决方案,或者我显然不能理解它。

由于我们使用Java来处理xml / xsd,xsd 驻留在类路径中,因此xsd中的xs:import可能是个问题。

如果答案是“在这些约束条件下无法使用xsd”,那我很好。

所有想法?

3 个答案:

答案 0 :(得分:1)

您尝试的架构在XSD 1.1中有效 - 使用最新版本的Saxon或Xerces再次尝试。

答案 1 :(得分:0)

如果你至少知道你期望在容器类型中的类型的名称,那么你可以使它们成为xs:anyType类型。但是你需要知道可能的类型名称列表,否则模式定义它们的重点是什么?

更新:我不正确,您可以创建容器<xs:any/>但是这会阻止您指定容器中必须有<data />元素。

答案 2 :(得分:0)

最终有效,即使它不让我开心:

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的验证按预期工作并如上所述。 是的,我知道:禁用默认激活的安全性/健全性功能可能不是一个好主意。但直到知道没有时间找到更好的方法。