查看: 1761|回复: 0

[.NET开发] 验证xml是否符合指定xsd

发表于 2018-3-6 08:00:00

xml是常用的一种数据文件格式,它的定义文件为Xml schema definition(XSD),那么怎么验证一个xml是否符合它的schema定义呢?

本文给出C#的代码实现。

样例XML

存储在xml.xml文件中

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <xml>
  3. <age>10</age>
  4. <date>2018-01-01</date>
  5. <regex>111</regex>
  6. <gMonth>---10--</gMonth>
  7. <language>english</language>
  8. <anyURI>./news.html</anyURI>
  9. </xml>
复制代码
样例xsd

存储在xsd.xsd文件中

  1. <?xml version="1.0"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  3. <xs:element name="xml">
  4. <xs:complexType>
  5. <xs:sequence>
  6. <xs:element name="age">
  7. <xs:simpleType>
  8. <xs:restriction base="xs:decimal">
  9. <xs:enumeration value="10"/>
  10. <xs:enumeration value="20"/>
  11. <xs:enumeration value="30"/>
  12. </xs:restriction>
  13. </xs:simpleType>
  14. </xs:element>
  15. <xs:element name="date">
  16. <xs:simpleType>
  17. <xs:restriction base="xs:date">
  18. <xs:enumeration value="2018-01-01Z"/>
  19. </xs:restriction>
  20. </xs:simpleType>
  21. </xs:element>
  22. <xs:element name="regex">
  23. <xs:simpleType>
  24. <xs:restriction base="xs:string">
  25. <xs:pattern value="[0-9][0-9][0-9]"/>
  26. </xs:restriction>
  27. </xs:simpleType>
  28. </xs:element>
  29. <xs:element name="gMonth" type="xs:gMonth"/>
  30. <xs:element name="language" type="xs:language"/>
  31. <xs:element name="anyURI" type="xs:anyURI"/>
  32. </xs:sequence>
  33. </xs:complexType>
  34. </xs:element>
  35. </xs:schema>
复制代码
完整代码

下面代码在Console Project中实现

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string xmlFile = "xml.xml";
  6. string xsdFile = "xsd.xsd";
  7. var exceptionMessage = string.Empty;
  8. VerifyXML(xsdFile, xmlFile, ref exceptionMessage);
  9. Console.WriteLine(exceptionMessage);
  10. Console.ReadKey();
  11. }
  12. private static void VerifyXML(string xsdFile, string xmlFile, ref string exceptionMessage)
  13. {
  14. XmlDocument doc = LoadXML(xmlFile);
  15. doc.Schemas = LoadXMLSchmeaFromXSDFile(xsdFile);
  16. string errorMessage = string.Empty;
  17. ValidationEventHandler eventHandler = new ValidationEventHandler(delegate (object sender, ValidationEventArgs e)
  18. {
  19. switch (e.Severity)
  20. {
  21. case XmlSeverityType.Error:
  22. errorMessage += e.Message;
  23. break;
  24. case XmlSeverityType.Warning:
  25. break;
  26. }
  27. });
  28. doc.Validate(eventHandler);
  29. exceptionMessage = errorMessage;
  30. }
  31. private static XmlDocument LoadXML(string xmlFile)
  32. {
  33. XmlDocument doc = new XmlDocument();
  34. doc.Load(xmlFile);
  35. return doc;
  36. }
  37. private static XmlSchemaSet LoadXMLSchmeaFromXSDFile(string path)
  38. {
  39. var schemas = new XmlSchemaSet();
  40. schemas.Add("", XmlReader.Create(path));
  41. return schemas;
  42. }
  43. }
复制代码


回复

使用道具 举报