xs:key,当键值不是键引用的成员时,为什么validation通过?
我有兴趣在我的Xsd中定义一个关键约束。 我的理解是,使用xs:key
应该约束用于引用值列表的成员的值。
假设我们使用的是样本Xsd,
样品Xml,
而且,比方说,一些简单的validation
[TestMethod] public void Test_Schema() { string schemaFileName = @"sampleSchema.xsd"; string xmlFileName = @"sampleXml.xml"; XmlReaderSettings settings = new XmlReaderSettings { ValidationType = ValidationType.Schema, ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation | XmlSchemaValidationFlags.ReportValidationWarnings, }; settings.Schemas.Add (schema); settings.ValidationEventHandler += (o, e) => { throw new Exception("CRASH"); }; XmlSchema schema = XmlSchema.Read ( File.OpenText (schemaFileName), (o, e) => { throw new Exception ("BOOM"); }); XmlReader reader = XmlReader.Create (xmlFileName, settings); while (reader.Read ()) { } }
怎么回事,当我为A/part[@ref-number]
使用坏值时,validation仍然成功?
上面的Xsd,Xml或validation中的任何一个或全部都是错误的吗? 或者我误解了xs:key
的预期目的?
像往常一样,经过一夜安眠和新面貌,在这次练习中发现了不少于2个错误 。
- 第一个错误,validation身份约束是一个显式过程,由
XmlReaderSettings.ValidationFlag
设置的XmlSchemaValidationFlags.ProcessIdentityConstraints
引起, - 第二个错误, msdn示例包含模式中的错误,
应该读取
。
完整的工作样本如下,
Xml样本
简单的validation器
[TestMethod] public void Test_Schema() { string schemaFileName = @"sampleSchema.xsd"; string xmlFileName = @"sampleXml.xml"; XmlSchema schema = XmlSchema.Read( File.OpenText(schemaFileName), (o, e) => { throw new Exception("BOOM"); }); XmlReaderSettings settings = new XmlReaderSettings { ValidationType = ValidationType.Schema, ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation | XmlSchemaValidationFlags.ReportValidationWarnings | // d'oh! explicit flag for processing identity constraints! XmlSchemaValidationFlags.ProcessIdentityConstraints, }; settings.Schemas.Add(schema); settings.ValidationEventHandler += (o, e) => { throw new Exception("CRASH"); }; XmlReader reader = XmlReader.Create(xmlFileName, settings); while (reader.Read()) { } }
我想你应该使用ValidationEventHandler:
settings.ValidationEventHandler += new ValidationEventHandler (ValidationCallBack); private static void ValidationCallBack (object sender, ValidationEventArgs args) {}