C# 验证XML并显示失败的内容
我正在尝试验证XML文件并向用户显示任何错误 简化示例: XML:C# 验证XML并显示失败的内容,c#,xml,validation,xml-serialization,xml-validation,C#,Xml,Validation,Xml Serialization,Xml Validation,我正在尝试验证XML文件并向用户显示任何错误 简化示例: XML: 我得到一个错误集合,这些错误都是有效的错误。不确定模式是否有助于该部分正常工作。我遇到的问题是将错误链接到导致错误的XML元素。可以在ValidationCallback方法的sender参数中找到数据。我在您发布的示例validationcallback方法的else语句中添加了几行 private static void ValidationCallBack(object sender, ValidationEventArg
我得到一个错误集合,这些错误都是有效的错误。不确定模式是否有助于该部分正常工作。我遇到的问题是将错误链接到导致错误的XML元素。可以在ValidationCallback方法的sender参数中找到数据。我在您发布的示例validationcallback方法的else语句中添加了几行
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
response.IsXMLValid = false;
if (args.Severity == XmlSeverityType.Warning)
{
XMLValidationMessage xmlm = new XMLValidationMessage();
xmlm.Severity = XmlSeverityType.Warning;
xmlm.LineNumber = 0;
xmlm.LinePosition = 0;
xmlm.Message = "Matching schema not found. No validation occurred.";
response.ValidationErrors.Add(xmlm);
}
else
{
// this will give you the name of the schema element that failed validation
var schemaInfo = ((XmlReader)sender).SchemaInfo;
var elementThatFailedValidation = schemaInfo.SchemaElement.Name;
XMLValidationMessage xmlm = new XMLValidationMessage();
xmlm.Severity = XmlSeverityType.Error;
xmlm.LineNumber = args.Exception.LineNumber;
xmlm.LinePosition = args.Exception.LinePosition;
xmlm.Message = args.Message;
response.ValidationErrors.Add(xmlm);
}
}
你能举一个你收到的错误的例子吗?该模式也很有用。
public class XMLValidationMessage
{
public int LineNumber;
public int LinePosition;
public string Message;
public XmlSeverityType Severity;
}
public class XMLValidationResponse
{
/// <summary>
/// Result of the XML Validation.
/// </summary>
[Description("Result of the XML Validation")]
public bool IsXMLValid { get; set; }
/// <summary>
/// XML Validation Errors.
/// </summary>
[Description("XML Validation Errors")]
public List<XMLValidationMessage> ValidationErrors { get; set; }
public XMLValidationResponse()
{
ValidationErrors = new List<XMLValidationMessage>();
}
}
private static XMLValidationResponse response = new XMLValidationResponse();
public static XMLValidationResponse ValidateXML(string XMLFile, string XSDFile)
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, XSDFile);
response.IsXMLValid = true;
Validate(XMLFile, schemaSet);
return response;
}
private static void Validate(String filename, XmlSchemaSet schemaSet)
{
XmlSchema compiledSchema = null;
foreach (XmlSchema schema in schemaSet.Schemas())
{
compiledSchema = schema;
}
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(compiledSchema);
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
settings.ValidationType = ValidationType.Schema;
//Create the schema validating reader.
XmlReader vreader = XmlReader.Create(filename, settings);
while (vreader.Read()) { }
//Close the reader.
vreader.Close();
}
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
response.IsXMLValid = false;
if (args.Severity == XmlSeverityType.Warning)
{
XMLValidationMessage xmlm = new XMLValidationMessage();
xmlm.Severity = XmlSeverityType.Warning;
xmlm.LineNumber = 0;
xmlm.LinePosition = 0;
xmlm.Message = "Matching schema not found. No validation occurred.";
response.ValidationErrors.Add(xmlm);
}
else
{
XMLValidationMessage xmlm = new XMLValidationMessage();
xmlm.Severity = XmlSeverityType.Error;
xmlm.LineNumber = args.Exception.LineNumber;
xmlm.LinePosition = args.Exception.LinePosition;
xmlm.Message = args.Message;
response.ValidationErrors.Add(xmlm);
}
}
ValidationErrors Count = 14 System.Collections.Generic.List<MyApp.Xml.XMLValidationMessage>
- [0] {MyApp.Xml.XMLValidationMessage} MyApp.Xml.XMLValidationMessage
LineNumber 89 int
LinePosition 127 int
Message "The 'http://www.myweb.co.uk/srm/mscc:Remarks' element is invalid - The value 'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...' is invalid according to its datatype 'http://www.MyWeb.co.uk/srm/mscc:String50Type' - The actual length is greater than the MaxLength value." string
Severity Error System.Xml.Schema.XmlSeverityType
private static void ValidationCallBack(object sender, ValidationEventArgs args)
{
response.IsXMLValid = false;
if (args.Severity == XmlSeverityType.Warning)
{
XMLValidationMessage xmlm = new XMLValidationMessage();
xmlm.Severity = XmlSeverityType.Warning;
xmlm.LineNumber = 0;
xmlm.LinePosition = 0;
xmlm.Message = "Matching schema not found. No validation occurred.";
response.ValidationErrors.Add(xmlm);
}
else
{
// this will give you the name of the schema element that failed validation
var schemaInfo = ((XmlReader)sender).SchemaInfo;
var elementThatFailedValidation = schemaInfo.SchemaElement.Name;
XMLValidationMessage xmlm = new XMLValidationMessage();
xmlm.Severity = XmlSeverityType.Error;
xmlm.LineNumber = args.Exception.LineNumber;
xmlm.LinePosition = args.Exception.LinePosition;
xmlm.Message = args.Message;
response.ValidationErrors.Add(xmlm);
}
}