XDocument.Validate总是成功的

我有一个模式文件,它没有定义任何目标命名空间,即它的定义如下所示:

   

相应的XML如下所示:

    

使用例如Altova XMLSpy或Oxygen XML Editor对架构validation此XML失败。

但是,我在C#(.NET 4.0)中的validation不会失败。 XML作为XDocument对象处理。 如果我已经正确理解,那么如果在模式中没有找到名称空间,则XDocument.Validate()执行不严格的validation。 因此validation不会失败。 但是,我如何为XDocument实现“严格”validation?

这就是我尝试validationXML的方法:

 public static void ValidateXml(XDocument xml, string xsdFilename) { XmlReaderSettings settings = new XmlReaderSettings(); XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.Add(string.empty, xsdFilename); settings.ValidationType = ValidationType.Schema; settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallback); xml.Validate(schemaSet, ValidationCallback); } private static void ValidationCallback(object sender, ValidationEventArgs args) { if (args.Severity == XmlSeverityType.Warning) { // Do warning stuff... } else if (args.Severity == XmlSeverityType.Error) { // Do error stuff... } } 

我不确定是否可以使用Validate方法; 如果您在XDocument上使用validationXmlReader,其中ValidationFlags设置为发出validation警告,如

  XDocument doc = XDocument.Load("../../XMLFile1.xml"); XmlSchemaSet schemaSet = new XmlSchemaSet(); schemaSet.Add(null, "../../XMLSchema1.xsd"); XmlReaderSettings xrs = new XmlReaderSettings(); xrs.ValidationType = ValidationType.Schema; xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; xrs.Schemas = schemaSet; xrs.ValidationEventHandler += (o, s) => { Console.WriteLine("{0}: {1}", s.Severity, s.Message); }; using (XmlReader xr = XmlReader.Create(doc.CreateReader(), xrs)) { while (xr.Read()) { } } 

然后ValidationEventHandler会为每个找不到架构信息的节点发出警告。 因此,您的ValidationEventHandler可以检查此类警告。 但您也可以简单地将doc.Root.Name.Namespace与调用Validate方法之前的模式的目标名称空间进行比较。