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






4.75/5 (4投票s)
根据定义的 XSD 验证 XML
引言
在本文中,我将讨论如何根据定义的 XSD 验证 XML。 在阅读本文之前,必须具备 XML 和 XSD 的基本知识。
本文描述以下内容
- 使用 XSD 验证 XML 数据,例如提供的 XML 标签是否存在且与 XSD 相符
- 如何编写自定义验证,例如检查电子邮件 ID 是否有效
- 如何从 XML 生成 XSD
- 如何在 XML 数据验证失败时生成自定义错误
- 如何在 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? 简单地按照以下步骤操作
- 打开 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>
- 由于我们需要编写代码来检查电子邮件 ID 是否有效,我们可以通过更改
EMAIL
标签类型从String
更改为自定义类型来做到这一点,如下所示<xs:element name="Email" type="ValidateEmail" />
- 由于我们已经定义了自定义类型,我们需要定义其结构如下
<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>
- 最终我们的 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”的标签到表单
- 转到 Complex.aspx.cs 并定义类级别的全局变量,如下所示
private int nErrors = 0; private string strErrorMsg = string.Empty; public string Errors { get { return strErrorMsg; } }
- 转到 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");
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; }
- 用于处理任何异常的
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,如下所示
- 添加一个未在 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>
- 在
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>
编码愉快… 希望这有帮助!