网站开发 ssh 菜鸟,温州网络公司网站建设,做电影网站被告版权,利用php做直播网站假使说XML是一个数据库#xff0c;那么XSD就是这个数据库的结构。由此可见#xff0c;XSD是如此重要#xff0c;如果没有它#xff0c;我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢#xff1f;那是不可能完成的任务#xff0c;如果你将XML数据文件当作普通…假使说XML是一个数据库那么XSD就是这个数据库的结构。由此可见XSD是如此重要如果没有它我们如何声明以及验证我们需要的XML数据文件的格式和合法性呢那是不可能完成的任务如果你将XML数据文件当作普通的文本文件去验证的话。 我用下面一个例子来解释如何定义XSD以及如何使用它来验证 1. 首先来看一下我们的数据文件 ?xml version1.0 encodingutf-8 ?
OrderOrderID10248/OrderIDOrderDate2009-01-01/OrderDateDetailsOrderItemItemNumber1/ItemNumberProductID1/ProductIDQuantity2/QuantityUnitPrice20/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID1/ProductIDQuantity2/QuantityUnitPrice20/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID1/ProductIDQuantity2/QuantityUnitPrice20/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID1/ProductIDQuantity2/QuantityUnitPrice20/UnitPrice/OrderItem/Details
/Order这是一个典型的订单数据。我们来分析一下这份文档 必须有OrderID而且必须是整数型,integer必须有OrderDate而且必须是日期型datetime必须有至少一个OrderItem这个Item必须包含四部分信息 ItemNumberintegerProductIDintegerQuantity,doubleUnitPrice,double 2. 我们来定义一个XSD文件。有关XSD的知识很多有兴趣的朋友可以参考下面这个链接 http://www.w3school.com.cn/schema/index.asp ?xml version1.0 encodingutf-8?
xs:schema idOrderSchematargetNamespacehttp://tempuri.org/OrderSchema.xsdelementFormDefaultqualifiedxmlnshttp://tempuri.org/OrderSchema.xsdxmlns:mstnshttp://tempuri.org/OrderSchema.xsdxmlns:xshttp://www.w3.org/2001/XMLSchema
xs:element nameOrderxs:complexTypexs:sequencexs:element nameOrderID typexs:integer/xs:elementxs:element nameOrderDate typexs:date/xs:elementxs:element nameDetailsxs:complexTypexs:group refOrderItemGroup minOccurs1 maxOccursunbounded/xs:group/xs:complexType/xs:element/xs:sequence/xs:complexType/xs:element!-- 定义一个OrderItem的复杂类型 --xs:group nameOrderItemGroupxs:sequencexs:element nameOrderItemxs:complexTypexs:sequencexs:element nameItemNumber typexs:integer/xs:elementxs:element nameProductID typexs:integer/xs:elementxs:element nameQuantity typexs:double/xs:elementxs:element nameUnitPrice typexs:double/xs:element/xs:sequence/xs:complexType/xs:element/xs:sequence/xs:group
/xs:schema 【备注】这个架构也可以通过Visual Studio的“XML”菜单》“创建架构”得到。3. 下面来看看如何使用该架构对数据文件进行验证 .NET Framework并没有提供简单易行的验证方法我们需要写一些代码 % Page LanguageC# AutoEventWireuptrue CodeBehindDefault.aspx.cs InheritsWebApplication1._Default%!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdhtml xmlnshttp://www.w3.org/1999/xhtml
head runatservertitle/title
/head
bodyform idform1 runatserverdivasp:Button IDbtValidateFile runatserver Text验证文档 OnClickValidateFile //div/form
/body
/html代码文件 using System;
using System.Text;
using System.Xml;namespace WebApplication1
{public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}StringBuilder sb null;protected void ValidateFile(object sender, EventArgs e){string dataFile Server.MapPath(Order.xml);string schemaFile Server.MapPath(OrderSchema.xsd);string namespaceUrl http://tempuri.org/OrderSchema.xsd;XmlReaderSettings settings new XmlReaderSettings();settings.ValidationType ValidationType.Schema;settings.Schemas.Add(namespaceUrl, schemaFile);settings.ValidationEventHandler new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);string errorMessage这不是一个合乎规范的数据文件;sb new StringBuilder();XmlReader reader XmlReader.Create(dataFile, settings);try{reader.MoveToContent();while (reader.Read()){if (reader.NodeType XmlNodeType.Document reader.NamespaceURI ! namespaceUrl){Response.Write(errorMessage);break;}}}catch (XmlException ex){sb.AppendFormat({0}br /, ex.Message);}finally{reader.Close();}if (sb.Length 0)Response.Write(该文档是合法的);elseResponse.Write(sb.ToString());}void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e){sb.AppendFormat({0}br /, e.Message);}}
}准备就绪之后我们可以立即按下F5键进行调试。因为现在文档确实是合法的所以点击按钮之后会输出一个正确的消息。 我们故意将文档改成下面这样子 ?xml version1.0 encodingutf-8 ?
Order xmlnshttp://tempuri.org/OrderSchema.xsdOrderID1/OrderIDOrderDate2009-1-1/OrderDateDetails/Details
/Order 我们没有提供OrderItem,同时OrderDate的格式是不正确的。XML里面的日期必须是类似这样的格式YYYY-MM-DD) 此时我们去点击页面中的按钮就会发现下面这样的错误提示 小结一下我们可以通过XMLReader的读取验证XML文档的合法性。关键点在于我们指定给这个XMLReader一些Settings 这些代码还可以封装一下以免更好的重复利用。 之前有一位XML方面的MVP也专门写了一个组件可以方便地做验证。请参考http://msdn.microsoft.com/zh-cn/library/aa468554.aspx 4. 对于有命名空间的情况则会复杂很多 我已经多次提到如果有命名空间的情况XML的操作包括验证和转换等等都会变得更加复杂。但仍然需要面对这个现实 我们假设XML数据文件是类似下面的格式 ?xml version1.0 encodingutf-8 ?
Order xmlns:dhttp://www.xizhang.comd:OrderID1/d:OrderIDOrderDate2009-01-01/OrderDateDetailsOrderItemItemNumber1/ItemNumberProductID2/ProductIDQuantity3/QuantityUnitPrice3/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID2/ProductIDQuantity3/QuantityUnitPrice3/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID2/ProductIDQuantity3/QuantityUnitPrice3/UnitPrice/OrderItem/Details
/Order 与之前的文档相比这个文档多了一个命名空间的信息在OrderID上面我们加上了命名空间的限定 我们通过点击菜单“XML”》“创建架构”来生成架构。它会生成两个文件分别如下 Order.xsd ?xml version1.0 encodingutf-8?
xs:schema xmlns:dhttp://www.xizhang.com attributeFormDefaultunqualified elementFormDefaultqualified xmlns:xshttp://www.w3.org/2001/XMLSchemaxs:import namespacehttp://www.xizhang.com /xs:element nameOrderxs:complexTypexs:sequencexs:element refd:OrderID /xs:element nameOrderDate typexs:date /xs:element nameDetailsxs:complexTypexs:sequencexs:element maxOccursunbounded nameOrderItemxs:complexTypexs:sequencexs:element nameItemNumber typexs:unsignedByte /xs:element nameProductID typexs:unsignedByte /xs:element nameQuantity typexs:unsignedByte /xs:element nameUnitPrice typexs:unsignedByte //xs:sequence/xs:complexType/xs:element/xs:sequence/xs:complexType/xs:element/xs:sequence/xs:complexType/xs:element
/xs:schema 还有一个Order1.xsd ?xml version1.0 encodingutf-8?
xs:schema xmlns:tnshttp://www.xizhang.com attributeFormDefaultunqualified elementFormDefaultqualified targetNamespacehttp://www.xizhang.com xmlns:xshttp://www.w3.org/2001/XMLSchemaxs:element nameOrderID typexs:unsignedByte /
/xs:schema 我们注意到在Order.xsd中用了一个ref的方式实现了一个元素的引用。其他它是引用了Order1.xsd中的OrderID元素。 但是我们怎么知道是这样的引用关系呢我们并没有在Order.XSD中看到这个关系呢 其实是有的。你可以在Order.xsd文件中按下F4键查看属性 点击架构右侧的那个按钮 下面我们来测试一下带有命名空间的情况下如何验证 首先你应该选中Order.xsd和Order1.xsd并将它们保存到项目根目录。因为他们默认是被创建在临时文件夹的为Order.xsd添加一个TargetNamespace?xml version1.0 encodingutf-8?
xs:schema xmlns:dhttp://www.xizhang.com attributeFormDefaultunqualified elementFormDefaultqualified xmlns:xshttp://www.w3.org/2001/XMLSchema targetNamespacehttp://www.xizhang.comxs:import namespacehttp://www.xizhang.com /xs:element nameOrderxs:complexTypexs:sequencexs:element refd:OrderID /xs:element nameOrderDate typexs:date /xs:element nameDetailsxs:complexTypexs:sequencexs:element maxOccursunbounded nameOrderItemxs:complexTypexs:sequencexs:element nameItemNumber typexs:unsignedByte /xs:element nameProductID typexs:unsignedByte /xs:element nameQuantity typexs:unsignedByte /xs:element nameUnitPrice typexs:unsignedByte //xs:sequence/xs:complexType/xs:element/xs:sequence/xs:complexType/xs:element/xs:sequence/xs:complexType/xs:element
/xs:schema 修改一下代码 string dataFile Server.MapPath(Order.xml);string schemaFile Server.MapPath(Order.xsd);string namespaceUrl http://www.xizhang.com;XmlReaderSettings settings new XmlReaderSettings();settings.ValidationType ValidationType.Schema;settings.Schemas.Add(namespaceUrl, schemaFile);settings.Schemas.Add(namespaceUrl, Server.MapPath(Order1.xsd));//这里要加第二个文件 同样道理我们故意去修改一下数据文件 ?xml version1.0 encodingutf-8 ?
Order xmlns:dhttp://www.xizhang.comd:OrderID1/d:OrderIDOrderDate2009/1/1/OrderDateDetailsOrderItemItemNumber1/ItemNumberProductID2/ProductIDQuantity3/QuantityUnitPrice3/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID2/ProductIDQuantity3/QuantityUnitPrice3/UnitPrice/OrderItemOrderItemItemNumber1/ItemNumberProductID2/ProductIDQuantity3/QuantityUnitPrice3/UnitPrice/OrderItem/Details
/Order 小结 这样我们就完成了对包含有命名空间的XML数据文件的验证工作。这个操作需要两个XML架构文件他们之间形成一个引用关系。如果有多个不同的命名空间则可能会有多个辅助的架构文件。 需要注意的是在Order.xsd中最好是用下面的语法去定义schemaLocation xs:import namespacehttp://www.xizhang.com schemaLocationOrder1.xsd / 如果这样定义了代码中就可以省略掉添加第二个架构文件的代码 //settings.Schemas.Add(namespaceUrl, Server.MapPath(Order1.xsd));//这里要加第二个文件转载于:https://www.cnblogs.com/amylis_chen/archive/2012/06/28/2568901.html