使用带有XmlReader的内联XML模式验证XML字符串

时间:2013-08-03 11:53:24

标签: c# xmlreader

我想使用内联XML架构验证字符串,并希望处理XMLSchemaException。我尝试了下面的代码:

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

传递无效参数while (xmlrdr.Read());时,我收到错误“XMLException未处理”。但我只想处理XMLSchemaValidationException。请让我知道如何实现这一目标。

1 个答案:

答案 0 :(得分:1)

您必须添加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);
 }