使用XSD进行批量数据导入时生成的XML数据有效性这样的功能已经不是第一次做了,之前做的时候都没有碰到什么问题,这些天在开发中遇到了一个很头痛的问题就是无论XSD文件规则怎么写,验证都是通过的。

下面是具体的代码:

C#验证部分:

        /// <summary>
        /// 对已转换成映射XML文件使用指定架构文件进行验证
        /// </summary>
        /// <param name="mappingXmlFile">映射XML文件</param>
        /// <param name="schemaFile">架构文件</param>
        /// <returns>返回空字符串表示验证成功,否则返回错误信息</returns>
        public string ValidateMappingXMLFile(string mappingXmlFile, string schemaFile)
        {
            string namespaceUrl = "http://tempuri.org/MsisdnSchema.xsd";
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add(namespaceUrl, schemaFile);
            settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);

            sb = new StringBuilder();

            XmlReader reader = XmlReader.Create(mappingXmlFile, settings);
            try
            {
                reader.MoveToContent();
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Document && reader.NamespaceURI != namespaceUrl)
                    {
                        return "Data does not match the specifications!";
                    }
                }
            }
            catch (XmlException ex)
            {
                sb.AppendFormat(ex.Message + "\n");
            }
            finally
            {
                reader.Close();
            }
            if (String.IsNullOrEmpty(sb.ToString()))
            {
                return string.Empty;
            }
            else
            {
                return "Validation Faild,Please check the validity of the data:" + sb.ToString();
            }
        }

        public void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
        {
            sb.Append(e.Message + "\n");
        }

XML数据:

 <?xml version="1.0" encoding="utf-8"?>
 <MSISDN>
  <List>
     <BATCH_IMPORT_ID>6adbca51-c55f-4022-bcc0-84b209a78a38</BATCH_IMPORT_ID>
     <BATCH_NO>20131027172271517</BATCH_NO>
     <PORT_IN_MSISDN>31632000000</PORT_IN_MSISDN>
     <CUSTOMER_TYPE>Business</CUSTOMER_TYPE>
     <ID_TYPE>Passport</ID_TYPE>
     <ID_NUMBER>1234567</ID_NUMBER>
     <NATIONALITY>Netherlands</NATIONALITY>
     <DAY_OF_BIRTH>2013-10-27</DAY_OF_BIRTH>
     <COUNTRY_ID>Netherlands</COUNTRY_ID>
     <LANGUAGE>Dutch - The Netherlands</LANGUAGE>
     <COMPANY>ET.</COMPANY>
     <STATUS_ID>Active</STATUS_ID>
     <TITLE_ID>Mr.</TITLE_ID>
     <FIRST_NAME>Mark</FIRST_NAME>
     <MIDDLE_NAME>
     </MIDDLE_NAME>
     <LAST_NAME>Mulder</LAST_NAME>
     <EMAIL>654645</EMAIL>
     <ADDRESS>Schipholboulevard</ADDRESS>
     <HOUSE_NO>249</HOUSE_NO>
     <HOUSE_EXTENTION>
     </HOUSE_EXTENTION>
     <ZIP_CODE>4324</ZIP_CODE>
     <CITY>Schipholboulevard</CITY>
     <PACKAGE_NAME>88 mobile prepaid 2.5.0</PACKAGE_NAME>
     <BILLING_EMAIL>martin.mulder@elephanttalk.com</BILLING_EMAIL>
     <CUSTOMER_ID_DONOR>56346546</CUSTOMER_ID_DONOR>
     <WISHDATE_PORTING>2013-10-27</WISHDATE_PORTING>
     <NETWORK_OPERATOR>BEN</NETWORK_OPERATOR>
     <SERVICE_PROVIDER>Atlantic Telecom</SERVICE_PROVIDER>
   </List>
 </MSISDN>

XSD验证架构

 <?xml version="1.0" encoding="utf-8"?>
 <xs:schema
           id="MSISDNSchema"
           targetNamespace="http://tempuri.org/MsisdnSchema.xsd"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns="http://tempuri.org/MsisdnSchema.xsd"
           xmlns:mstns="http://tempuri.org/MsisdnSchema.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="MSISDN">
     <xs:complexType>
       <xs:sequence>
         <xs:element maxOccurs="unbounded" name="List">
           <xs:complexType>
             <xs:sequence>
               <xs:element name="BATCH_IMPORT_ID" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="36"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="BATCH_NO" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="PORT_IN_MSISDN">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="CUSTOMER_TYPE" minOccurs="0" default="Business">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="ID_TYPE" minOccurs="0" default="Passport">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="ID_NUMBER" default="1234567">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="20"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="NATIONALITY" minOccurs="0" default="Netherlands">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="20"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="DAY_OF_BIRTH" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:date">
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="COUNTRY_ID" minOccurs="0" default="Netherlands">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="LANGUAGE" minOccurs="0" default="Netherlands">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="COMPANY" minOccurs="0" fixed="ET.">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="STATUS_ID" minOccurs="0" fixed="Active">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="20"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="TITLE_ID" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="20"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="FIRST_NAME" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="MIDDLE_NAME" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="LAST_NAME" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="EMAIL" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                     <xs:pattern value="([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="ADDRESS" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="HOUSE_NO" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="25"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="HOUSE_EXTENTION" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="ZIP_CODE" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="25"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="CITY" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="PACKAGE_NAME" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="BILLING_EMAIL" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="CUSTOMER_ID_DONOR" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="100"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="WISHDATE_PORTING" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:date">
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="NETWORK_OPERATOR" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="10"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
               <xs:element name="SERVICE_PROVIDER" minOccurs="0">
                 <xs:simpleType>
                   <xs:restriction base="xs:string">
                     <xs:maxLength value="50"/>
                   </xs:restriction>
                 </xs:simpleType>
               </xs:element>
             </xs:sequence>
           </xs:complexType>
         </xs:element>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
 </xs:schema>

可见,<EMAIL>654645</EMAIL>项是一个不符合Email正则表达式验证的Email地址,可是执行的结果依然是没有进行验证。

在园子里的另一篇文章http://q.cnblogs.com/q/38157/ 给了我启发,我把XML数据的对XSD命名空间的引用,<MSISDN xmlns="http://tempuri.org/MsisdnSchema.xsd" >

发现这次验证是可以正常进行的,说明问题出在了XML数据上。

“XmlReader 在执行验证的时候不光需要xsd文件,还需要xml文件显示的引用xsd的NameSpaces,这样才就可以去匹配验证每个元素。”果然如帖子中说的一样。

可这样格式的XML数据,在进行校验过后,要转换成Dataset进行再次处理会比较麻烦,需要先获取XML架构再取数据,那么能不能不修改XML数据就验证成功呢?

我对代码和XSD数据进行了如下修改:

xsd里面
去掉

targetNamespace="http://tempuri.org/MsisdnSchema.xsd"

代码里面(写出的部分为替换注释掉部分的代码)

//string namespaceUrl = "http://tempuri.org/MsisdnSchema.xsd";

//settings.Schemas.Add(namespaceUrl, schemaFile);

settings.Schemas.Add(null, schemaFile);

//if (reader.NodeType == XmlNodeType.Document && reader.NamespaceURI != namespaceUrl)

if (reader.NodeType == XmlNodeType.Document && reader.NamespaceURI !=null)

再运行程序,代码就通过了,验证可以正常运行。

可能有不少同学在学习XSD验证XML的时候,会参考园子里的一篇博客

http://www.cnblogs.com/chenxizhang/archive/2009/06/19/1507121.html

我想指出的是,

如果XML数据文件没有引用任何XSD的命名空间,那么在代码中,是不需要设置XmlReader的namespaceUrl的,并且XSD中也不需要设置targetNamespace项的值,否则验证是不会进行的,验证结果永远都是成功。

C# xsd 验证 XML数据有效性 问题的更多相关文章

  1. 使用架构(XSD)验证XML文件

    假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...

  2. C# 利用Xsd验证xml

    最近做项目时,用到了xml的序列化与反序列化, 发现最好用xsd来验证xml, 因为反序列化xml不校验xsd. 方法:xmlData变量为xml字符串 MemoryStream ms = new M ...

  3. 用xsd验证xml

    using System; using System.Text; using System.Xml; namespace WebApplication1 { public partial class ...

  4. XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...

  5. C# 使用xsd文件验证XML 格式是否正确

    C# 使用xsd文件验证XML 格式是否正确 核心示例代码: //创建xmlDocument XmlDocument doc = new XmlDocument(); //创建声明段 如<?xm ...

  6. 28.XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式

    转自https://www.cnblogs.com/gdjlc/archive/2013/09/08/3308229.html XML Schema 语言也称作 XML Schema 定义(XML S ...

  7. XML的应用 ---- 从一个范例看xml数据、xsd验证、xslt样式

    从一个范例看XML的应用 引言 如果你已经看了Asp.Net Ajax的两种基本开发模式 这篇文章,你可能很快会发现这样一个问题:在那篇文章的方式2中,客户端仅仅是发送了页面上一个文本框的内容到服务端 ...

  8. Delphi 7验证XML合法性(利用DTD、XSD)

    拥有正确语法的XML被称为“形式良好”的XML.通过DTD验证的XML是“合法”的XML.DTD(文档类型定义)的作用是定义XML 文档的合法构建模块.它使用一系列的合法元素来定义文档结构.XML S ...

  9. 通过xsd schema结构来验证xml是否合法

    import sys import StringIO import lxml from lxml import etree from StringIO import StringIO # Constr ...

随机推荐

  1. 06_java之类概述

    01引用数据类型_类 * A: 数据类型 * a: java中的数据类型分为:基本类型和引用类型 * B: 引用类型的分类 * a: Java为我们提供好的类,比如说:Scanner,Random等. ...

  2. django之admin站点

    Admin站点 通过使用startproject创建的项目模版中,默认Admin被启用 1.创建管理员的用户名和密码 python manage.py createsuperuser 然后按提示填写用 ...

  3. [Z] 将samba共享文件夹映射到linux的目录下

    Linux系统下访问远程共享资源 使用mount加载共享目录: -把WinXP机器192.168.16.249上的共享目录test001映射到本地目录/wdl/下. -把Linux机器192.168. ...

  4. vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)

    vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ...

  5. TThread 线程的例子

    TThread 线程的例子 D:\Documents\Embarcadero\Studio\14.0\Samples\CPP\RTL\Threads TThread类   该线程类可以完成大多数的线程 ...

  6. Redis入门 - Windows环境搭建与第一个C# Sample

    什么是Redis? Redis是一个开源.支持网络.基于内存.键值对存储数据库,使用ANSI C编写.从2013年5月开始,Redis的开发由Pivotal赞助.在这之前,其开发由VMware赞助.根 ...

  7. 解决SharePoint下载文件时自动修改扩展名的问题

    今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件 ...

  8. 使用Django完成CRM管理系统

    CRM介绍: CRM即客户关系管理,是指企业用CRM技术来管理与客户之间的关系.在不同场合下,CRM可能是一个管理学术语,可能是一个软件系统.通常所指的CRM,指用计算机自动化分析销售.市场营销.客户 ...

  9. [bzoj2212]Tree Rotations(线段树合并)

    解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...

  10. 150. Evaluate Reverse Polish Notation (Stack)

    Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, ...