Search code examples
c#xmlreader

Validating XML string using inline XML schema with XmlReader


I want to validate a string using an inline XML schema and want to handle XMLSchemaException. I tried the code below:

String parameter="<HostName>Arasanalu</HostName><AdminUserName>Administrator</AdminUserName>
    <AdminPassword>A1234</AdminPassword><PlaceNumber>38</PlaceNumber>"

    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
    settings.ValidationFlags |= XmlSchemaValidationFlags.AllowXmlAttributes;

    //settings.Schemas.Add(null,"http://www.w3.org/2001/XMLSchema");
    XmlSchemaSet sch = new XmlSchemaSet();
    sch.Add(null,"http://www.w3.org/2001/XMLSchema");
    try
    {
        // Create the XmlReader object.
        XmlReader xmlrdr = XmlReader.Create(new StringReader("<root>" + parameter + "</root>"),
            settings);
            // Parse the file. 
            while (xmlrdr.Read());
        }
        catch (XmlSchemaValidationException ex)
        {
            Console.WriteLine("The file could not read the value at XML  format is not correct due to" + ex);
        }

I was getting the error "XMLException was unhandled" when passing an invalid parameter while (xmlrdr.Read());. But I only want to handle XMLSchemaValidationException. Please let me know how I can achive this.


Solution

  • You have to add an ValidationEventHandler

    String     parameter=@"<HostName>Arasanalu</HostName>
                                 <AdminUserName>Administrator</AdminUserName>
                                 <AdminPassword>A1234</AdminPassword>
                                 <PlaceNumber>38</PlaceNumber>";
    
    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.DtdProcessing= DtdProcessing.Parse;
    settings.ValidationType = ValidationType.Schema;
    settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema |
    XmlSchemaValidationFlags.AllowXmlAttributes |
    XmlSchemaValidationFlags.ReportValidationWarnings |
    XmlSchemaValidationFlags.ProcessIdentityConstraints |
    XmlSchemaValidationFlags.ProcessSchemaLocation;
    
    settings.Schemas.Add(null,XmlReader.Create(new StringReader(
    @"<xs:schema xmlns:xs=""http://www.w3.org/2001/XMLSchema"">
    <xs:element name=""root"">
        <xs:complexType>
          <xs:sequence>
            <xs:element name=""HostName"" type=""xs:string"" />
            <xs:element name=""AdminUserName"" type=""xs:string"" />
            <xs:element name=""AdminPassword"" type=""xs:string"" />
            <xs:element name=""PlaceNumber"" type=""xs:positiveInteger"" />
          </xs:sequence>
        </xs:complexType>
    </xs:element></xs:schema>"), settings));
    
    settings.ValidationEventHandler += (s,e) => 
          { 
            throw new XmlSchemaValidationException(e.Message); 
          };
    try
    {
      // Create the XmlReader object.
      XmlReader xmlrdr = XmlReader.Create(
                      new StringReader("<root>" + parameter + "</root>"), settings);
      // Parse the file. 
      while (xmlrdr.Read());
    }
    catch (XmlSchemaValidationException ex)
    {
      Console.WriteLine(
              "The file could not read the value at XML  format is not correct due to" + ex);
     }