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个错误

  1. 第一个错误,validation身份约束是一个显式过程,由XmlReaderSettings.ValidationFlag设置的XmlSchemaValidationFlags.ProcessIdentityConstraints引起,
  2. 第二个错误, 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) {}