【问题标题】:Java XSD: validate only by mandatoryJava XSD:仅通过强制验证
【发布时间】:2017-03-02 09:59:06
【问题描述】:
我有以下 XSD 验证:
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new File(xsdPath));
validator = schema.newValidator();
Source xml = new StreamSource(new ByteArrayInputStream(xml));
validator.validate(vastXml);
如何仅通过必填字段/元素验证 XML (minOccur>0, use="required")
即,如果 XML 中的内容不在 XSD 中,则验证将成功。
仅当缺少其中一个必填字段时才会失败。
【问题讨论】:
标签:
java
xml
validation
xsd
【解决方案1】:
如果您想检查某些约束而不检查其他约束,唯一的方法是修改架构,使其仅包含您要检查的约束。我认为任何模式处理器都不会允许您在检查某些约束而不是其他约束方面有选择性。
【解决方案2】:
XML Schema 支持未在模式中定义的元素的占位符,但这与minOccurs 属性无关:
<xs:any processContents="lax"/>
你可以调整:
-
具有namespace 属性的元素的命名空间:
<xs:any namespace="##any" processContents="lax"/>
<xs:any namespace="##other" processContents="lax"/>
<xs:any namespace="##local" processContents="lax"/>
<xs:any namespace="##targetNamespace" processContents="lax"/>
<xs:any namespace="http://www.example.com" processContents="lax"/>
-
他们应该被处理的严格程度。在您的情况下,lax 将确保即使未定义元素,XML 文档也会进行验证。但是,strict 会要求存在模式定义。 skip 会接受任何东西。
<xs:any namespace="##any" processContents="lax"/>
<xs:any namespace="##any" processContents="strict"/>
<xs:any namespace="##any" processContents="skip"/>