是否可以使用一个或多个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>
当然,含糊不清,违反了“独特粒子归因”。
我还在这里阅读了第二个命名空间的使用Creating a 'flexible' XML schema 但由于我们无法更改xml,这似乎不是一个解决方案,或者我显然不能理解它。
由于我们使用Java来处理xml / xsd,xsd 驻留在类路径中,因此xsd中的xs:import可能是个问题。
如果答案是“在这些约束条件下无法使用xsd”,那我很好。
所有想法?
答案 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的验证按预期工作并如上所述。 是的,我知道:禁用默认激活的安全性/健全性功能可能不是一个好主意。但直到知道没有时间找到更好的方法。