如何用 Visual C#.net 中的 DTD、 XDR,或 XSD 驗證 XML 文件
本文演示瞭如何將文件型別定義 (DTD)、 一個 Microsoft XML 資料縮減 (XDR) 架構或 XML 架構定義語言 (XSD) 架構應用到一個可擴充套件標記語言 (XML) 文件。本文還介紹瞭如何使用XmlValidatingReader 類來驗證指定的語法對 XML 文件,以及如何使用在記憶體中快取的架構XmlSchemaCollection 類,以優化 XML 驗證。
XML 文件包含的元素和屬性。它們提供靈活且功能強大的一種方法中,應用程式和組織之間交換資料。若要指定允許的結構和內容的 XML 文件,您可以編寫一個 DTD、 一個的 XDR 架構或 XSD 架構。XSD 架構是首選的方法若要指定在 Microsoft.net 框架但 dtd 的 XML 語法,還支援 XDR 架構。
要求
本文假定您熟悉下列主題:- Microsoft Visual C#.net 或 Microsoft Visual Basic.net 語法
- 包括驗證問題的 XML 概念
建立 XML 文件
- 啟動 Visual Studio.net。
- 建立新的 XML 檔案在本地計算機上。
- 對 XML 文件,以表示一種產品目錄中的新增以下資料:
<Product ProductID="123"> <ProductName>Rugby jersey</ProductName> </Product>
- 儲存該檔案作為 Product.xml 在新的資料夾中名為 C:/MyFolder。
使用該 DTD
建立 DTD,並連結到 XML 文件
- 在 Visual Studio.net 中,建立一個空文字檔案。
- 將下面的 DTD 宣告新增到該檔案描述 XML 文件的語法:
<!ELEMENT Product (ProductName)> <!ATTLIST Product ProductID CDATA #REQUIRED> <!ELEMENT ProductName (#PCDATA)>
- 將檔案另存為中將 C:/MyFolder Product.dtd 目錄。
- 在 Visual Studio.net 中開啟 Product.xml。
- Product.xml 要連結到 DTD 檔案的 XML 文件的頂部新增下面的 DOCTYPE 語句:
<?xml version="1.0"?> <!DOCTYPE Product SYSTEM "Product.dtd">
- 將修改後的 XML 文件儲存為 ProductWithDTD.xml。
使用 DTD 驗證 XML 文件
- 在 Visual Studio.net 中,建立一個新 Visual C# 控制檯應用程式專案命名 ValidateXml。
- 將兩個 using 語句新增到 Class1.cs 的開頭,如下所示:
using System.Xml; // for XmlTextReader and XmlValidatingReader using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
- Class1.cs,在宣告布林型變數,如下所示命名 isValidMain 方法的開始之前:
private static bool isValid = true; // If a validation error occurs, // set this flag to false in the // validation event handler.
- 建立要從 Main 方法中的文字檔案中讀取 XML 文件的 XmlTextReader 物件,然後建立一個XmlValidatingReader 來驗證此 XML 資料,如下所示:
XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithDTD.xml"); XmlValidatingReader v = new XmlValidatingReader(r);
- ValidationTypeXmlValidatingReader 物件的屬性指示需要 (DTD、 XDR 或 架構) 的有效性規則的型別。將此屬性設定為 DTD,如下所示:
v.ValidationType = ValidationType.DTD;
- 如果發生任何驗證錯誤,驗證讀取器將生成一個驗證事件。新增以下程式碼以註冊驗證事件處理程式 (MyValidationEventHandler 方法中實現第 8 步):
v.ValidationEventHandler += new ValidationEventHandler(MyValidationEventHandler);
- 新增以下程式碼以讀取和驗證 XML 文件。如果發生任何驗證錯誤,MyValidationEventHandler 的呼叫,以解決該錯誤。此方法將 isValid 設定為 false (請參閱第 8 步)。您可以驗證文件是否有效或無效後檢查 isValid 的狀態
while (v.Read()) { // Can add code here to process the content. } v.Close(); // Check whether the document is valid or invalid. if (isValid) Console.WriteLine("Document is valid"); else Console.WriteLine("Document is invalid");
- Main 方法之後,寫入 MyValidationEventHandler 方法,如下所示:
public static void MyValidationEventHandler(object sender, ValidationEventArgs args) { isValid = false; Console.WriteLine("Validation event/n" + args.Message); }
- 生成並執行該應用程式。應用程式應報告的 XML 文件有效。
- 在 Visual Studio.net 中,修改 ProductWithDTD.xml 以使它無效 (例如對於刪除該"<productname>橄欖球運動衫</productname>"元素)。
- 再次執行該應用程式。您應收到以下錯誤訊息:
驗證事件
元素產品具有無效的內容。應為產品名稱。
在 file:///C:/MyFolder/ProductWithDTD.xml(4, 5) 時,出現了一個錯誤。
是無效的文件
使用 XDR 架構
建立 XDR 架構並連結到 XML 文件
- 在 Visual Studio.net 中,建立一個空文字檔案。
- 將下面的 XDR 架構定義新增到該檔案描述 XML 文件的語法:
<?xml version="1.0"?> <Schema name="ProductSchema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="Product" content="eltOnly"> <attribute type="ProductID" required="yes"/> <element type="ProductName"/> </ElementType> <AttributeType name="ProductID" dt:type="int"/> <ElementType name="ProductName" dt:type="string"/> </Schema>
- 將檔案另存為中將 C:/MyFolder Product.xdr 目錄。
- 開啟 Product.xml 原始檔並將其連結到在 XDR 架構,如下所示:
<?xml version="1.0"?> <Product ProductID="123" xmlns="x-schema:Product.xdr"> <ProductName>Rugby jersey</ProductName> </Product>
- 將修改後的 XML 文件儲存為 ProductWithXDR.xml。
使用 XDR 架構驗證 XML 文件
- 修改您的應用程式,以便 XmlTextReader 載入 ProductWithXDR.xml,如下所示:
XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithXDR.xml");
- XDR 到設定 ValidationType,以便驗證讀取器執行 XDR 驗證:
v.ValidationType = ValidationType.XDR;
- 生成並執行該應用程式。應用程式應報告的 XML 文件有效。
- 修改 ProductWithXDR.xml 以使它無效。
- 生成並再次執行該應用程式。您應該會收到驗證錯誤。
使用 XSD 架構
建立 XSD 架構並連結到 XML 文件
- 在 Visual Studio.net 中,建立一個空文字檔案。
- 將以下 XSD 架構定義新增到該檔案描述 XML 文件的語法:
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Product"> <xsd:complexType> <xsd:sequence> <xsd:element name="ProductName" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="ProductID" use="required" type="xsd:int"/> </xsd:complexType> </xsd:element> </xsd:schema>
- 將檔案另存為中將 C:/MyFolder Product.xsd 目錄。
- 開啟原始 Product.xml,並將其連結到 XSD 架構,如下所示:
<?xml version="1.0"?> <Product ProductID="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Product.xsd"> <ProductName>Rugby jersey</ProductName> </Product>
- 將修改後的 XML 文件儲存為 ProductWithXSD.xml。
使用 XSD 架構驗證 XML 文件
- 修改您的應用程式,以便 XmlTextReader 載入 ProductWithXSD.xml,如下所示:
XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithXSD.xml");
- ValidationType 設 架構 中,以便驗證讀取器執行 XSD 架構驗證:
v.ValidationType = ValidationType.Schema;
- 生成並執行應用程式以使用 XSD 架構驗證 XML 文件。
使用 XSD 架構中的名稱空間
- 在 Visual Studio.net 中,開啟 ProductWithXSD.xml。
- 宣告預設名稱空間 urn: MyNamespace 文件中。此外,修改 XSD 連結,以便它指定 XSD 架構來驗證此名稱空間中的內容:
<?xml version="1.0"?> <Product ProductID="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:MyNamespace" xsi:schemaLocation="urn:MyNamespace Product.xsd"> <ProductName>Rugby jersey</ProductName> </Product>
- 將所做的更改儲存到 ProductWithXSD.xml。
- 開啟 Product.xsd。因此,架構應用於名稱空間,如下所示修改 <xsd:schema> 開始標記urn: MyNamespace:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:MyNamespace" elementFormDefault="qualified">
- 將所做的更改儲存到 Product.xsd。
- 生成並執行應用程式以使用 XSD 架構驗證 XML 文件。
快取名稱空間
- 在 Visual Studio.net 中,開啟 Class1.cs。Main 方法的開始處建立XmlSchemaCollection 物件,如下所示:
XmlSchemaCollection cache = new XmlSchemaCollection();
- XmlSchemaCollection 物件允許您在記憶體中快取架構以提高效能。每個架構都與一個不同的名稱空間相關聯。將下面的程式碼新增到快取 Product.xsd:
cache.Add("urn:MyNamespace", "C://MyFolder//Product.xsd");
- 將以下語句建立要新增到 XmlValidatingReader 的架構快取,以便讀者可以使用記憶體中架構XmlValidatingReader 物件的程式碼的後面新增:
v.Schemas.Add(cache);
驗證它工作的
- 生成,然後執行該應用程式。
- 驗證 XML 文件仍驗證 XSD 架構。
- 修改 ProductWithXSD.xml 以使它無效。
- 驗證應用程式檢測到這些驗證錯誤。
相關文章
- XML中的DTD文件型別定義XML型別
- Spring中DTD和XSDSpring
- 在ASP.NET中如何用C#.NET實現基於表單的驗證ASP.NETC#
- 探索 DTD 在 XML 中的作用及解析:深入理解文件型別定義XML型別
- 使用GraphQL對資料模型和訊息格式實現類似XML的DTD驗證模型XML
- XML Schema(XSD)詳解:定義 XML 文件結構合法性的完整指南XML
- 在java程式中用DTD來驗證xml格式不起作用是為什麼?請教高手JavaXML
- XML Schema和XML DTD的資料型別比較XML資料型別
- 給XML檔案定義DTDXML
- DTD文件型別定義型別
- XML XSD XSL區別XML
- Html-文件型別(DTD)和DOCTYPEHTML型別
- 如何用xml替換掉structs中的tagXMLStruct
- Java中Dom解析xml文件JavaXML
- 自定義基於XML的驗證器XML
- java 實現的XML schema 驗證(轉)JavaXML
- Office 365 - For security reasons DTD is prohibited in this XML documentXML
- C# 設定或驗證 PDF中的文字域格式C#
- Serialize Your Deck with Positron [XML Serialization, XSD, C#]XMLC#
- XHTML 對文件型別(DOCTYPE)的驗證HTML型別
- 如何用程式碼修改struts中的web.xml配置WebXML
- C# 使用JavaScript設定或驗證 PDF中的文字域格式C#JavaScript
- Delphi6/7 中XML 文件的應用 (轉)XML
- ACCESS 密碼驗證/文字驗證中的小坑密碼
- SAR-303 xml validator驗證框架XML框架
- 在資料庫中如何驗證 In-Memory 選項的使用 (文件 ID 2178917.1)資料庫
- XML簡明教程(7)什麼是XML文件中的資料型別(轉)XML資料型別
- jsp頁面中的陣列怎麼用validation.xml來驗證呢?JS陣列XML
- PHP中的郵箱驗證PHP
- No grammar constraints (DTD or XML Schema) referenced in the document.的兩種解決辦法AIXML
- XML和Java: 低階或高階的 XML API?XMLJavaAPI
- iOS 中對 HTTPS 證書鏈的驗證iOSHTTP
- Asp.net中基於Forms驗證的角色驗證授權ASP.NETORM
- 5.3. 驗證 Seam安全中的驗證特性是基於JAAS
- XSD中自定義型別的三種方式型別
- xsl中,對xml文件查詢的結果再次查詢XML
- DTD – 元素概述
- C#.NET 中你必須知道的反射C#反射