使用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()
。
相反,您可以使用validationXmlReader
和XmlNodeReader
来validation现有的XmlDocument
(使用带有StringReader
的XmlNodeReader
而不是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包含行和列的字段。
- 错误“非静态字段,方法或属性’QuickSharp.CokeMachine.TotalInsertedCoins’需要对象引用”
- 无法将类型’System.Drawing.Image’隐式转换为’System.Drawing.Bitmap’
- 在没有外部库的情况下在C#中播放动态创建的简单声音
- 如何在ADO.NET Entity Framework上“选择count(*)”
- 运行时错误:无法加载文件或程序集’System.Web.WebPages.Razor,Version = 3.0.0.0
- 如何让msi覆盖旧文件?
- 无法使用vb.net加载asp.net mvc 3中的区域视图
- UnityException:Tag:未定义
- 值类型如何实现ref类型