Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证XML并显示失败的内容_C#_Xml_Validation_Xml Serialization_Xml Validation - Fatal编程技术网

C# 验证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文件并向用户显示任何错误

简化示例:

XML:


我得到一个错误集合,这些错误都是有效的错误。不确定模式是否有助于该部分正常工作。我遇到的问题是将错误链接到导致错误的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);
    }

}