断言包含XSD

时间:2016-11-09 09:44:52

标签: xml xsd xmllint

我想使用XSD为XML创建条件验证。我想如果元素Unit是“uri”那么元素Value必须包含“http”,否则如果元素Unit是“date”那么元素Value必须是时间戳,依此类推......我开始简单的验证使用xs:assert并且不起作用。我已经测试了xs:assertion,但它产生了同样的错误。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    FrLoginBinding binding = DataBindingUtil.inflate(inflater, R.layout.fr_login, container, false);
    binding.setTest(new TestVM());
    return binding.getRoot();
}

xmllint --noout --schema metadata.xsd metadata.xml 
metadata.xsd:46: element assert: Schemas parser error : Element '{http://www.w3.org/2001/XMLSchema}complexType': The content is not valid. Expected is (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))).
WXS schema metadata.xsd failed to compile

2 个答案:

答案 0 :(得分:1)

xs:assert和xs:assertion需要XSD 1.1处理器。但是您使用的是xmllint,这是一个XSD 1.0处理器。

答案 1 :(得分:1)

正如@potame和@MichaelKay所说,当xs:assert需要XSD 1.1处理器时,您的错误是由于xs:assert使用XSD 1.0处理器。

您有几个选择:

  1. 接受不太严格的验证。
  2. 在XSD之外验证。
  3. 切换到XSD 1.1处理器。
  4. 重新设计您的XML。
  5. 关于#4,您的XML现在非常抽象。如果你要转向更具体的元素命名,XSD 1.0可以为你做更多的类型检查。例如,当UnitValue时,您可以只使用Unit类型的uri元素,而不是需要对URI元素进行特殊检查的xsd:anyURI元素。 {1}}。 (事实上​​,对于它是什么而不是类型 ,您可能更具体,名称URI;例如:HomepagePaymentAPIEndpoint。)