C# 使用XSD模式进行Xml验证

C# 使用XSD模式进行Xml验证,c#,validation,xsd,C#,Validation,Xsd,下面的代码帮助我使用XSD模式验证XML文件 XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add(null, xsdFilePath); settings.ValidationType = ValidationType.Schema; settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(set

下面的代码帮助我使用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还告诉我错误是什么,但没有告诉我错误在哪里或在哪一行。是否有任何方法可以获取无法验证XML的行号?

这不符合您的要求吗

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

不幸的是,似乎无法将自己的
XmlReaderSettings
对象传递给
XmlDocument.Validate()

相反,您可以使用验证
XmlReader
XmlNodeReader
来验证现有的
XmlDocument
(使用
XmlNodeReader
StringReader
而不是
XmlDocument

和处理程序:

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。消息文本中包含行/列


ValidationEventArgs.Exception有行和列字段。

+1完全遗漏了e.Exception.LineNumber和e.Exception.LinePosition。为什么在开始时将其放入XML文档中?它似乎什么也没做。@JeremyHolovac是真的,它只是2007年论坛()的一个答案的副本,下面的评论提到:“当我去掉
XmlDocument
并用
StringReader
替换
XmlNodeReader
时,它就起作用了。”
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));
}