C# xsd 验证 XML数据有效性 问题
使用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数据有效性 问题的更多相关文章
- 使用架构(XSD)验证XML文件
假使说XML是一个数据库,那么XSD就是这个数据库的结构.由此可见,XSD是如此重要,如果没有它,我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢?那是不可能完成的任务,如果你将XML数据 ...
- C# 利用Xsd验证xml
最近做项目时,用到了xml的序列化与反序列化, 发现最好用xsd来验证xml, 因为反序列化xml不校验xsd. 方法:xmlData变量为xml字符串 MemoryStream ms = new M ...
- 用xsd验证xml
using System; using System.Text; using System.Xml; namespace WebApplication1 { public partial class ...
- XSD(XML Schema Definition)用法实例介绍以及C#使用xsd文件验证XML格式
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD),作用是定义 XML 文档的合法构建模块,类似 DTD,但更加强大. 作用有: ①定义 ...
- C# 使用xsd文件验证XML 格式是否正确
C# 使用xsd文件验证XML 格式是否正确 核心示例代码: //创建xmlDocument XmlDocument doc = new XmlDocument(); //创建声明段 如<?xm ...
- 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 ...
- XML的应用 ---- 从一个范例看xml数据、xsd验证、xslt样式
从一个范例看XML的应用 引言 如果你已经看了Asp.Net Ajax的两种基本开发模式 这篇文章,你可能很快会发现这样一个问题:在那篇文章的方式2中,客户端仅仅是发送了页面上一个文本框的内容到服务端 ...
- Delphi 7验证XML合法性(利用DTD、XSD)
拥有正确语法的XML被称为“形式良好”的XML.通过DTD验证的XML是“合法”的XML.DTD(文档类型定义)的作用是定义XML 文档的合法构建模块.它使用一系列的合法元素来定义文档结构.XML S ...
- 通过xsd schema结构来验证xml是否合法
import sys import StringIO import lxml from lxml import etree from StringIO import StringIO # Constr ...
随机推荐
- python开发_function annotations
在看python的API的时候,发现了一个有趣的东东,即:python的方法(函数)注解(Function Annotation) 原文: 4.7.7. Function Annotations Fu ...
- linux rar安装
1.wget http://www.rarsoft.com/rar_CN/rarlinux-3.9.3.tar.gz 2.tar 3.make && make install; 4.需 ...
- mysql导出数据库数据及表结构
1,导出远程数据库数据到本地 mysql -A wj_sms -h192.168.1.105 -uroot -p4321 -ss -e "set NAMES 'utf8';SELECT * ...
- leetcode462
public class Solution { public int MinMoves2(int[] nums) { var list = nums.OrderBy(x => x).ToList ...
- 分环境部署SpringBoot日志logback-spring.xml
springboot按照profile进行打印日志 log4j logback slf4j区别? 首先谈到日志,我们可能听过log4j logback slf4j这三个名词,那么它们之间的关系是怎么样 ...
- flutter container image FittedBox AspectRatio
当container指定了大小时,里面放入图片后,图片是居中自适应的,根据图片的大小,垂直居中或者水平居中.因为Image的默认自适应就是Contain, BoxFit.Contain 如果conta ...
- Spring 学习记录5 BeanFactory
主题 记录我对BeanFactor接口的简单的学习. BeanFactory我感觉就是管理bean用的容器,持有一堆的bean,你可以get各种bean.然后也提供一些bean相关的功能比如别名呀之类 ...
- 什么时候必须使用UI相机? 多个相机的作用原理?
首先,要从主画布说起,maincanvas,这个有什么限制?主画布是一张默认用来绘制UI的地方,这些UI必须是系统提供的UI组件,在画面下挂一个3D物体或非UI的2D物品是不会被绘制到画布上的,但是仍 ...
- LVM 逻辑卷管理
简介: LVM ( Logical Volume Manager ) 逻辑卷管理 一.创建 LV 1.首先在你的虚拟机上添加一块新的硬盘用来做实验. 2.安装 lvm : yum -y install ...
- FastDFS 分布式文件系统
1 学习目标 了解项目中使用FastDFS的原因和意义. 掌握FastDFS的架构组成部分,能说出tracker和storage的作用. 了解FastDFS+nginx上传和下载的执行流程 ...