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方法之前的模式的目标名称空间进行比较。