使用XSD架构进行Xmlvalidation

以下代码帮助我validation具有XSD架构的XML文件。

XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(null, xsdFilePath); settings.ValidationType = ValidationType.Schema; settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler); XmlDocument document = new XmlDocument(); document.Load(xmlFilePath); XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings); while (rdr.Read()) { } isValid = true; 

ValidationEventHandler还告诉我错误是什么,但没告诉我他们所在的’where’或’在哪一行’。 有没有办法获得XML无法validation的行号?

这不是你做的事情吗?

创建XmlReaderSettings对象并通过该对象启用警告。

不幸的是,似乎没有办法将您自己的XmlReaderSettings对象传递给XmlDocument.Validate()
相反,您可以使用validationXmlReaderXmlNodeReader来validation现有的XmlDocument (使用带有StringReaderXmlNodeReader而不是XmlDocument

 XmlDocument x = new XmlDocument(); x.LoadXml(XmlSource); XmlReaderSettings settings = new XmlReaderSettings(); settings.CloseInput = true; settings.ValidationEventHandler += Handler; settings.ValidationType = ValidationType.Schema; settings.Schemas.Add(null, ExtendedTreeViewSchema); settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessIdentityConstraints | XmlSchemaValidationFlags.ProcessInlineSchema | XmlSchemaValidationFlags.ProcessSchemaLocation ; StringReader r = new StringReader(XmlSource); using (XmlReader validatingReader = XmlReader.Create(r, settings)) { while (validatingReader.Read()) { /* just loop through document */ } } 

和处理程序:

 private static void Handler(object sender, ValidationEventArgs e) { if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) System.Diagnostics.Trace.WriteLine( String.Format("Line: {0}, Position: {1} \"{2}\"", e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)); } 

ValidationEventArgs.Message在其文本中包含行/列。

ValidationEventArgs.Exception包含行和列的字段。