日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發布時間:2025/3/20 asp.net 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用架构(XSD)验证XML文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假使說XML是一個數據庫,那么XSD就是這個數據庫的結構。由此可見,XSD是如此重要,如果沒有它,我們如何聲明以及驗證我們需要的XML數據文件的格式和合法性呢?那是不可能完成的任務,如果你將XML數據文件當作普通的文本文件去驗證的話。

我用下面一個例子來解釋如何定義XSD以及如何使用它來驗證

1. 首先來看一下我們的數據文件

<?xml version="1.0" encoding="utf-8" ?> <Order><OrderID>10248</OrderID><OrderDate>2009-01-01</OrderDate><Details><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>1</ProductID><Quantity>2</Quantity><UnitPrice>20</UnitPrice></OrderItem></Details> </Order>

這是一個典型的訂單數據。我們來分析一下這份文檔

  • 必須有OrderID,而且必須是整數型,integer
  • 必須有OrderDate,而且必須是日期型,datetime
  • 必須有至少一個OrderItem,這個Item必須包含四部分信息
    • ItemNumber,integer
    • ProductID,integer
    • Quantity,double
    • UnitPrice,double

?

2. 我們來定義一個XSD文件。有關XSD的知識很多,有興趣的朋友可以參考下面這個鏈接

http://www.w3school.com.cn/schema/index.asp

<?xml version="1.0" encoding="utf-8"?> <xs:schema id="OrderSchema"targetNamespace="http://tempuri.org/OrderSchema.xsd"elementFormDefault="qualified"xmlns="http://tempuri.org/OrderSchema.xsd"xmlns:mstns="http://tempuri.org/OrderSchema.xsd"xmlns:xs="http://www.w3.org/2001/XMLSchema" ><xs:element name="Order"><xs:complexType><xs:sequence><xs:element name="OrderID" type="xs:integer"></xs:element><xs:element name="OrderDate" type="xs:date"></xs:element><xs:element name="Details"><xs:complexType><xs:group ref="OrderItemGroup" minOccurs="1" maxOccurs="unbounded"></xs:group></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element><!-- 定義一個OrderItem的復雜類型 --><xs:group name="OrderItemGroup"><xs:sequence><xs:element name="OrderItem"><xs:complexType><xs:sequence><xs:element name="ItemNumber" type="xs:integer"></xs:element><xs:element name="ProductID" type="xs:integer"></xs:element><xs:element name="Quantity" type="xs:double"></xs:element><xs:element name="UnitPrice" type="xs:double"></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:group> </xs:schema> ? 【備注】這個架構也可以通過Visual Studio的“XML”菜單=》“創建架構”得到。

3. 下面來看看如何使用該架構對數據文件進行驗證

.NET Framework并沒有提供簡單易行的驗證方法,我們需要寫一些代碼

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"><title></title> </head> <body><form id="form1" runat="server"><div><asp:Button ID="btValidateFile" runat="server" Text="驗證文檔" OnClick="ValidateFile" /></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 version="1.0" encoding="utf-8" ?> <Order xmlns="http://tempuri.org/OrderSchema.xsd"><OrderID>1</OrderID><OrderDate>2009-1-1</OrderDate><Details></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 version="1.0" encoding="utf-8" ?> <Order xmlns:d="http://www.xizhang.com"><d:OrderID>1</d:OrderID><OrderDate>2009-01-01</OrderDate><Details><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem></Details> </Order>

與之前的文檔相比,這個文檔多了一個命名空間的信息,在OrderID上面,我們加上了命名空間的限定

我們通過點擊菜單:“XML”=》“創建架構”來生成架構。它會生成兩個文件,分別如下

Order.xsd

<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:d="http://www.xizhang.com" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:import namespace="http://www.xizhang.com" /><xs:element name="Order"><xs:complexType><xs:sequence><xs:element ref="d:OrderID" /><xs:element name="OrderDate" type="xs:date" /><xs:element name="Details"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" name="OrderItem"><xs:complexType><xs:sequence><xs:element name="ItemNumber" type="xs:unsignedByte" /><xs:element name="ProductID" type="xs:unsignedByte" /><xs:element name="Quantity" type="xs:unsignedByte" /><xs:element name="UnitPrice" type="xs:unsignedByte" /></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element> </xs:schema>

?

還有一個Order1.xsd

<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://www.xizhang.com" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.xizhang.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="OrderID" type="xs:unsignedByte" /> </xs:schema>

?

?

我們注意到,在Order.xsd中,用了一個ref的方式,實現了一個元素的引用。其他它是引用了Order1.xsd中的OrderID元素。

但是,我們怎么知道是這樣的引用關系呢?我們并沒有在Order.XSD中看到這個關系呢

其實是有的。你可以在Order.xsd文件中,按下F4鍵,查看屬性

點擊架構右側的那個按鈕

下面我們來測試一下,帶有命名空間的情況下如何驗證

  • 首先,你應該選中Order.xsd和Order1.xsd,并將它們保存到項目根目錄。因為他們默認是被創建在臨時文件夾的
  • 為Order.xsd添加一個TargetNamespace
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:d="http://www.xizhang.com" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs=http://www.w3.org/2001/XMLSchema targetNamespace="http://www.xizhang.com"><xs:import namespace="http://www.xizhang.com" /><xs:element name="Order"><xs:complexType><xs:sequence><xs:element ref="d:OrderID" /><xs:element name="OrderDate" type="xs:date" /><xs:element name="Details"><xs:complexType><xs:sequence><xs:element maxOccurs="unbounded" name="OrderItem"><xs:complexType><xs:sequence><xs:element name="ItemNumber" type="xs:unsignedByte" /><xs:element name="ProductID" type="xs:unsignedByte" /><xs:element name="Quantity" type="xs:unsignedByte" /><xs:element name="UnitPrice" type="xs: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 version="1.0" encoding="utf-8" ?> <Order xmlns:d="http://www.xizhang.com"><d:OrderID>1</d:OrderID> <OrderDate>2009/1/1</OrderDate><Details><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem><OrderItem><ItemNumber>1</ItemNumber><ProductID>2</ProductID><Quantity>3</Quantity><UnitPrice>3</UnitPrice></OrderItem></Details> </Order>

?

小結:

這樣我們就完成了對包含有命名空間的XML數據文件的驗證工作。這個操作需要兩個XML架構文件,他們之間形成一個引用關系。如果有多個不同的命名空間,則可能會有多個輔助的架構文件。

?

需要注意的是,在Order.xsd中,最好是用下面的語法去定義schemaLocation

<xs:import namespace="http://www.xizhang.com" schemaLocation="Order1.xsd" />

如果這樣定義了,代碼中就可以省略掉添加第二個架構文件的代碼

//settings.Schemas.Add(namespaceUrl, Server.MapPath("Order1.xsd"));//這里要加第二個文件

總結

以上是生活随笔為你收集整理的使用架构(XSD)验证XML文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。