我有一个XML模式,我正在验证使用Xerces-C ++ 3.1.1。我的XML文档正常验证。我可以通过重命名元素或必需属性来导致验证失败,因此我非常确定Xerces正在使用模式做正确的事情。
但是,如果我将未知属性添加到任意元素,文档仍会验证。如果存在任何未定义的属性,我希望验证失败,但XML Schema规范和Xerces文档没有明确说明如何执行此操作。
这是我的xerces解析器设置:
parser.setErrorHandler(&errorHandler);
parser.loadGrammar(schemaPath.c_str(), Grammar::SchemaGrammarType);
parser.setDoNamespaces(true);
parser.setDoSchema(true);
parser.setValidationConstraintFatal(true);
parser.setValidationSchemaFullChecking(true);
架构和文档不使用命名空间,我没有使用属性通配符。
这是一个展示问题的玩具架构和文件;这与实际架构中的顶级元素相同。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qual\
ified">
<xs:element name="Document">
<xs:complexType>
<xs:attribute name="version"/>
</xs:complexType>
</xs:element>
</xs:schema>
尽管存在未知值属性,但本文档仍会针对此架构进行验证:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Document value="blar" version="22"/>
如果某个属性不在架构中,我希望验证失败,就像这种情况一样。