使用XSD模式进行XML验证

11

下面的代码帮助我使用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验证失败的行号?

2个回答

28

这个方法不就是您需要的吗?

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

不幸的是,似乎没有办法将自己的 XmlReaderSettings 对象传递给 XmlDocument.Validate()
相反,您可以使用验证 XmlReader 和一个 XmlNodeReader 来验证现有的 XmlDocument(使用一个带有 StringReader 而不是 XmlDocumentXmlNodeReader)。

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));
}

2
完全忽略了e.Exception.LineNumber和e.Exception.LinePosition。 - Elroy
你为什么一开始要把它放到XmlDocument中?这似乎没有任何作用。 - Jeremy Holovacs
@JeremyHolovacs 是的,这只是2007年论坛答案的复制(http://www.devnewsgroups.net/dotnetframework/t43762-catching-line-numbers-with-xmldocument-validate.aspx),下面的评论提到:“当我放弃`XmlDocument`并用`StringReader`替换`XmlNodeReader`时,它可以工作”。 - VonC

3

ValidationEventArgs.Message中包含了文本的行和列。

ValidationEventArgs.Exception有用于行和列的字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接