xmlserializer validation

后端 未结 2 1222
难免孤独
难免孤独 2020-12-01 19:01

I\'m using XmlSerializer to deserialize Xml achives. But I found the class xsd.exe generated only offers capability to read the xml, but no validation. For example, if one n

相关标签:
2条回答
  • 2020-12-01 19:43

    The following code will manually load and validate your XML against a schema file programmatically, allowing you to deal with any resulting errors and/or warnings.

    //Read in the schema document
    using (XmlReader schemaReader = XmlReader.Create("schema.xsd"))
    {
        XmlSchemaSet schemaSet = new XmlSchemaSet();
    
        //add the schema to the schema set
        schemaSet.Add(XmlSchema.Read(schemaReader, 
        new ValidationEventHandler(
            delegate(Object sender, ValidationEventArgs e)
            {
            }    
        )));
    
        //Load and validate against the programmatic schema set
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.Schemas = schemaSet;
        xmlDocument.Load("something.xml");
    
        xmlDocument.Validate(new ValidationEventHandler(
            delegate(Object sender, ValidationEventArgs e)
            {
                //Report or respond to the error/warning
            }
        )); 
     }
    

    Now obviously you desire to have the classes generated by xsd.exe to do this automatically and while loading (the above approach would require a second handling of the XML file), but a pre-load validate would allow you to programmatically detect a malformed input file.

    0 讨论(0)
  • 2020-12-01 19:44

    The following code should validate against a schema while deserializing. Similar code can be used to validate against a schema while serializing.

    private static Response DeserializeAndValidate(string tempFileName)
    {
        XmlSchemaSet schemas = new XmlSchemaSet();
        schemas.Add(LoadSchema());
    
        Exception firstException = null;
    
        var settings = new XmlReaderSettings
                       {
                           Schemas = schemas,
                           ValidationType = ValidationType.Schema,
                           ValidationFlags =
                               XmlSchemaValidationFlags.ProcessIdentityConstraints |
                               XmlSchemaValidationFlags.ReportValidationWarnings
                       };
        settings.ValidationEventHandler +=
            delegate(object sender, ValidationEventArgs args)
            {
                if (args.Severity == XmlSeverityType.Warning)
                {
                    Console.WriteLine(args.Message);
                }
                else
                {
                    if (firstException == null)
                    {
                        firstException = args.Exception;
                    }
    
                    Console.WriteLine(args.Exception.ToString());
                }
            };
    
        Response result;
        using (var input = new StreamReader(tempFileName))
        {
            using (XmlReader reader = XmlReader.Create(input, settings))
            {
                XmlSerializer ser = new XmlSerializer(typeof (Response));
                result = (Response) ser.Deserialize(reader);
            }
        }
    
        if (firstException != null)
        {
            throw firstException;
        }
    
        return result;
    }
    
    0 讨论(0)
提交回复
热议问题