如何用 Visual C#.net 中的 DTD、 XDR,或 XSD 驗證 XML 文件

哈哈哈哈哈我撒發表於2010-10-27

本文演示瞭如何將文件型別定義 (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 文件

  1. 啟動 Visual Studio.net。
  2. 建立新的 XML 檔案在本地計算機上。
  3. 對 XML 文件,以表示一種產品目錄中的新增以下資料:
    <Product ProductID="123">
       <ProductName>Rugby jersey</ProductName>
    </Product>
    					
  4. 儲存該檔案作為 Product.xml 在新的資料夾中名為 C:/MyFolder。

使用該 DTD

建立 DTD,並連結到 XML 文件

  1. 在 Visual Studio.net 中,建立一個空文字檔案。
  2. 將下面的 DTD 宣告新增到該檔案描述 XML 文件的語法:
    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    					
  3. 將檔案另存為中將 C:/MyFolder Product.dtd 目錄。
  4. 在 Visual Studio.net 中開啟 Product.xml。
  5. Product.xml 要連結到 DTD 檔案的 XML 文件的頂部新增下面的 DOCTYPE 語句:
    <?xml version="1.0"?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    					
  6. 將修改後的 XML 文件儲存為 ProductWithDTD.xml。

使用 DTD 驗證 XML 文件

  1. 在 Visual Studio.net 中,建立一個新 Visual C# 控制檯應用程式專案命名 ValidateXml。
  2. 將兩個 using 語句新增到 Class1.cs 的開頭,如下所示:
    using System.Xml;        // for XmlTextReader and XmlValidatingReader
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
    					
  3. Class1.cs,在宣告布林型變數,如下所示命名 isValidMain 方法的開始之前:
    private static bool isValid = true;      // If a validation error occurs,
                                             // set this flag to false in the
                                             // validation event handler. 
  4. 建立要從 Main 方法中的文字檔案中讀取 XML 文件的 XmlTextReader 物件,然後建立一個XmlValidatingReader 來驗證此 XML 資料,如下所示:
    XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithDTD.xml");
    XmlValidatingReader v = new XmlValidatingReader(r);
    					
  5. ValidationTypeXmlValidatingReader 物件的屬性指示需要 (DTD、 XDR 或 架構) 的有效性規則的型別。將此屬性設定為 DTD,如下所示:
    v.ValidationType = ValidationType.DTD;
    					
  6. 如果發生任何驗證錯誤,驗證讀取器將生成一個驗證事件。新增以下程式碼以註冊驗證事件處理程式 (MyValidationEventHandler 方法中實現第 8 步):
    v.ValidationEventHandler += 
       new ValidationEventHandler(MyValidationEventHandler);
    					
  7. 新增以下程式碼以讀取和驗證 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");
    					
  8. Main 方法之後,寫入 MyValidationEventHandler 方法,如下所示:
    public static void MyValidationEventHandler(object sender, 
                                                ValidationEventArgs args) 
    {
       isValid = false;
       Console.WriteLine("Validation event/n" + args.Message);
    }
    					
  9. 生成並執行該應用程式。應用程式應報告的 XML 文件有效。
  10. 在 Visual Studio.net 中,修改 ProductWithDTD.xml 以使它無效 (例如對於刪除該"<productname>橄欖球運動衫</productname>"元素)。
  11. 再次執行該應用程式。您應收到以下錯誤訊息:
    驗證事件
    元素產品具有無效的內容。應為產品名稱。
    在 file:///C:/MyFolder/ProductWithDTD.xml(4, 5) 時,出現了一個錯誤。
    是無效的文件

使用 XDR 架構

建立 XDR 架構並連結到 XML 文件

  1. 在 Visual Studio.net 中,建立一個空文字檔案。
  2. 將下面的 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>
    					
  3. 將檔案另存為中將 C:/MyFolder Product.xdr 目錄。
  4. 開啟 Product.xml 原始檔並將其連結到在 XDR 架構,如下所示:
    <?xml version="1.0"?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
       <ProductName>Rugby jersey</ProductName>
    </Product>
    					
  5. 將修改後的 XML 文件儲存為 ProductWithXDR.xml。

使用 XDR 架構驗證 XML 文件

  1. 修改您的應用程式,以便 XmlTextReader 載入 ProductWithXDR.xml,如下所示:
    XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithXDR.xml");
    					
  2. XDR 到設定 ValidationType,以便驗證讀取器執行 XDR 驗證:
    v.ValidationType = ValidationType.XDR;
    					
  3. 生成並執行該應用程式。應用程式應報告的 XML 文件有效。
  4. 修改 ProductWithXDR.xml 以使它無效。
  5. 生成並再次執行該應用程式。您應該會收到驗證錯誤。

使用 XSD 架構

建立 XSD 架構並連結到 XML 文件

  1. 在 Visual Studio.net 中,建立一個空文字檔案。
  2. 將以下 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>
    					
  3. 將檔案另存為中將 C:/MyFolder Product.xsd 目錄。
  4. 開啟原始 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>
    					
  5. 將修改後的 XML 文件儲存為 ProductWithXSD.xml。

使用 XSD 架構驗證 XML 文件

  1. 修改您的應用程式,以便 XmlTextReader 載入 ProductWithXSD.xml,如下所示:
    XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithXSD.xml");
    					
  2. ValidationType 設 架構 中,以便驗證讀取器執行 XSD 架構驗證:
    v.ValidationType = ValidationType.Schema;
    					
  3. 生成並執行應用程式以使用 XSD 架構驗證 XML 文件。

使用 XSD 架構中的名稱空間

  1. 在 Visual Studio.net 中,開啟 ProductWithXSD.xml。
  2. 宣告預設名稱空間 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>
    					
  3. 將所做的更改儲存到 ProductWithXSD.xml。
  4. 開啟 Product.xsd。因此,架構應用於名稱空間,如下所示修改 <xsd:schema> 開始標記urn: MyNamespace
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                targetNamespace="urn:MyNamespace"
                elementFormDefault="qualified">
    					
  5. 將所做的更改儲存到 Product.xsd。
  6. 生成並執行應用程式以使用 XSD 架構驗證 XML 文件。

快取名稱空間

  1. 在 Visual Studio.net 中,開啟 Class1.cs。Main 方法的開始處建立XmlSchemaCollection 物件,如下所示:
    XmlSchemaCollection cache = new XmlSchemaCollection();
    					
  2. XmlSchemaCollection 物件允許您在記憶體中快取架構以提高效能。每個架構都與一個不同的名稱空間相關聯。將下面的程式碼新增到快取 Product.xsd:
    cache.Add("urn:MyNamespace", "C://MyFolder//Product.xsd");
    					
  3. 將以下語句建立要新增到 XmlValidatingReader 的架構快取,以便讀者可以使用記憶體中架構XmlValidatingReader 物件的程式碼的後面新增:
    v.Schemas.Add(cache);
    					

驗證它工作的

  1. 生成,然後執行該應用程式。
  2. 驗證 XML 文件仍驗證 XSD 架構。
  3. 修改 ProductWithXSD.xml 以使它無效。
  4. 驗證應用程式檢測到這些驗證錯誤。

相關文章