XDocument.Validate ha sempre successo

Ho un file di schema che non definisce alcun namespace di destinazione, cioè la sua definizione assomiglia a questa:

   

Il codice XML corrispondente assomiglia a questo:

    

La convalida di questo XML rispetto allo schema con es. Altova XMLSpy o Oxygen XML Editor non riesce.

Tuttavia la mia convalida in C # (.NET 4.0) non fallisce. L’XML viene elaborato come un object XDocument . Se ho capito bene, XDocument.Validate() esegue una convalida lassista se nello schema non è stato trovato alcun spazio dei nomi. Quindi la convalida non fallisce. Ma come posso implementare una convalida “rigorosa” per XDocument ?

Questo è il modo in cui provo a convalidare l’XML:

 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... } } 

Non sono sicuro che sia ansible utilizzare il metodo Validate; se si utilizza un XmlReader di convalida su XDocument in cui ValidationFlags è impostato per emettere avvisi di convalida, come in

  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()) { } } 

quindi ValidationEventHandler emette un avviso per ogni nodo per il quale non trova le informazioni sullo schema. Quindi il tuo ValidationEventHandler potrebbe verificare tali avvisi. Ma potresti anche confrontare semplicemente doc.Root.Name.Namespace con lo spazio dei nomi di destinazione degli schemi che hai prima di chiamare il metodo Validate.