65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 XSD 进行 XML 验证以及自定义异常

2011 年 11 月 2 日

CPOL

2分钟阅读

viewsIcon

52797

根据定义的 XSD 验证 XML

引言

在本文中,我将讨论如何根据定义的 XSD 验证 XML。 在阅读本文之前,必须具备 XML 和 XSD 的基本知识。

本文描述以下内容

  1. 使用 XSD 验证 XML 数据,例如提供的 XML 标签是否存在且与 XSD 相符
  2. 如何编写自定义验证,例如检查电子邮件 ID 是否有效
  3. 如何从 XML 生成 XSD
  4. 如何在 XML 数据验证失败时生成自定义错误
  5. 如何在 XSD 中编写正则表达式

让我们按照以下步骤进行一个示例

  • 步骤 1:定义 XML
  • 步骤 2:生成/定义 XSD
  • 步骤 3:编写代码以使用 XSD 验证 XML
  • 步骤 4:通过定义自定义异常来处理异常

步骤 1:首先定义 XML,如下所示,并将 XML 文件命名为 Complex.XML

<Person xmlns:ns0="http://Testing.Message">
  <Name>Surya Prakash</Name>
  <Address>Malkajgiri</Address>
  <Phone>9966537965</Phone>
  <Email>suryaprakasash.bg@gmail.com</Email>
</Person>

步骤 2:如何生成 XSD? 简单地按照以下步骤操作

  1. 打开 Complex.XML 文件 -> 转到 VS 菜单 -> XML -> 创建架构,这将生成如下所示的 XSD
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:ns0="http://Testing.Message" attributeFormDefault="unqualified" 
    	elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Person">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Name" type="xs:string" />
            <xs:element name="Address" type="xs:string" />
            <xs:element name="Phone" type="xs:unsignedLong" />
            <xs:element name="Email" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  2. 由于我们需要编写代码来检查电子邮件 ID 是否有效,我们可以通过更改 EMAIL 标签类型从 String 更改为自定义类型来做到这一点,如下所示
    <xs:element name="Email" type="ValidateEmail" />
  3. 由于我们已经定义了自定义类型,我们需要定义其结构如下
    <xs:simpleType name="ValidateEmail">
        <xs:restriction base="xs:string">
          <xs:pattern value="[A-Za-z0-9_]+([-+.'][A-Za-z0-9_]+)
    	*@[A-Za-z0-9_]+([-.][A-Za-z0-9_]+)*\.[A-Za-z0-9_]+([-.][A-Za-z0-9_]+)*" />
        </xs:restriction>
      </xs:simpleType>
  4. 最终我们的 XSD 文件将如下所示
    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns:ns0="http://Testing.Message" attributeFormDefault="unqualified" 
    	elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      <xs:element name="Person">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Name" type="xs:string" />
            <xs:element name="Address" type="xs:string" />
            <xs:element name="Phone" type="xs:string" />
            <xs:element name="Email" type="ValidateEmail" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:simpleType name="ValidateEmail">
        <xs:restriction base="xs:string">
          <xs:pattern value="[A-Za-z0-9_]+([-+.'][A-Za-z0-9_]+)
    	*@[A-Za-z0-9_]+([-.][A-Za-z0-9_]+)*\.[A-Za-z0-9_]+([-.][A-Za-z0-9_]+)*" />
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>

步骤 3:创建一个名为“Complex.aspx”的新页面,并添加一个名为“lblMsg”的标签到表单

  1. 转到 Complex.aspx.cs 并定义类级别的全局变量,如下所示
    private int nErrors = 0;
    private string strErrorMsg = string.Empty;
    public string Errors { get { return strErrorMsg; } }
  2. 转到 Complex.aspx 页面的 Pageload 事件
    // IsValidXML return TRUE if no exception, false if any exceptions & 
    // respective message is appended to lblMsg
    // IsValidXML takes 2 parameters, param1: XML path, param2: XSD path
    
    if (!IsValidXml(@"D:\Surya Prakash\WorkAround\GopalSample\XML\Complex.xml", 
    	@"D:\Surya Prakash\WorkAround\GopalSample\XML\Complex.xsd"))
                lblMsg.Text =  Errors;
            else
                lblMsg.Text = string.Format("Success");
  3. IsValidXML 函数定义
    public bool IsValidXml(string xmlPath, string xsdPath)
        {
            bool bStatus = false;
            try
            {
                // Declare local objects
                XmlReaderSettings rs = new XmlReaderSettings();
                rs.ValidationType = ValidationType.Schema;
                rs.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation | 
                XmlSchemaValidationFlags.ReportValidationWarnings;
                // Event Handler for handling exception & 
                // this will be called whenever any mismatch between XML & XSD
                rs.ValidationEventHandler += 
    		new ValidationEventHandler(ValidationEventHandler);
                rs.Schemas.Add(null, XmlReader.Create(xsdPath));
    
    
    		// reading xml
                using (XmlReader xmlValidatingReader = XmlReader.Create(xmlPath, rs))
                { while (xmlValidatingReader.Read()) { } }
    
                ////Exception if error.
                if (nErrors > 0) { throw new Exception(strErrorMsg); }
                else { bStatus = true; }//Success
            }
            catch (Exception error) { bStatus = false; }
    
            return bStatus;
        }
  4. 用于处理任何异常的 EventHandler 主体定义
    void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            if (e.Severity == XmlSeverityType.Warning) strErrorMsg += "WARNING: ";
            else strErrorMsg += "ERROR: ";
            nErrors++;
    
            if (e.Exception.Message.Contains("'Email' element is invalid"))
            {
                strErrorMsg = strErrorMsg + getErrorString
    		("Provided Email data is Invalid", "CAPIEMAIL007") + "\r\n";
            }
            if (e.Exception.Message.Contains
    		("The element 'Person' has invalid child element"))
            {
                strErrorMsg = strErrorMsg + getErrorString
    		("Provided XML contains invalid child element", 
    		"CAPINVALID005") + "\r\n";
            }
            else
            {
                strErrorMsg = strErrorMsg + e.Exception.Message + "\r\n";
            }
        }

步骤 4:getErrorString:XML 字符串格式中的自定义错误生成

string getErrorString(string erroString, string errorCode)
    {
        StringBuilder errXMl = new StringBuilder();
        errXMl.Append("<MyError> <errorString> ERROR_STRING </errorString> 	
			<errorCode> ERROR_CODE </errorCode> </MyError>");
        errXMl.Replace("ERROR_STRING", erroString);
        errXMl.Replace("ERROR_CODE", errorCode);
        return errXMl.ToString();
    }

现在保存应用程序并使用以下 XML 运行它。 您应该在网页上看到 SUCCESS 消息

<Person xmlns:ns0="http://Testing.Message">
  <Name>Surya Prakash</Name>
  <Address>Malkajgiri</Address>
  <Phone>9966537965</Phone>
  <Email>suryaprakasash.bg@gmail.com</Email>
</Person>

到目前为止一切都很好,让我们修改 XML,如下所示

  1. 添加一个未在 XSD 中定义的额外标签。 因此,运行应用程序并查看异常。

    现在 XML 将如下所示

    <Person xmlns:ns0="http://Testing.Message">
      <Name>Surya Prakash</Name>
      <Address>Malkajgiri</Address>
      <Phone>9966537965</Phone>
        <Email>suryaprakasash.bg@gmail.com</Email>
      <EmpId>123592</EmpId>
    </Person>
  2. EMAIL 标签中提供无效的电子邮件。 因此,运行应用程序并查看异常。

    现在 XML 将如下所示

    <Person xmlns:ns0="http://Testing.Message">
      <Name>Surya Prakash</Name>
      <Address>Malkajgiri</Address>
      <Phone>9966537965</Phone>
      <Email>suryaprakasash.bg@gmail.@.com.com</Email>
    </Person>

编码愉快… 希望这有帮助!

© . All rights reserved.