February
4th,
2018
接續上篇的基本操作,這篇主要使用 LINQ to XML 來驗證 XML 資料。
目錄:
系列文完整範例程式碼請參考 poychang/Demo-Linq-To-Xml。
驗證 XML 資料
XML 本身的彈性很大,可以自由地建立你想要的元素名稱及屬性,而彈性太大時,我們就需要一種機制來規範這個彈性,XSD(XML Schema Definition) 就是其中一種描述 XML 的 XML Schema 語言,幫助我們規範 XML 檔案,讓 XML 必須遵守 XSD 所規範的規則,才算是合法的 XML 文件。
建立 XSD
這裡只用範例簡單介紹 XSD 的寫法。
請參考 sample.xsd
程式碼範例,裡面建立了以下規則:
- 根元素為
Students
- 根元素包含至少 1 個
Student
元素(minOccurs="1"
),且無上限(maxOccurs="unbounded"
) Student
元素必須設定Id
屬性- 每個元素必須包含以下 3 個子元素
Name
Gender
TotalMarks
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Students">
<xs:complexType>
<xs:sequence>
<xs:element name="Student" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" minOccurs="1" maxOccurs="1"/>
<xs:element name="Gender" minOccurs="1" maxOccurs="1"/>
<xs:element name="TotalMarks" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="Id" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
驗證
驗證的方式很簡單,基本上就三個步驟:
- 建立一個
XmlSchemaSet
物件,並載入你的 XSD 檔案 - 建立你的
xmlDocument
物件,並載入想要驗證 XML 檔案 - 透過
Validate()
方法,並指定要透過哪個 XmlSchemaSet 物件做驗證
下程式碼中,另外建了一個 isInvalid
幫助我們簡單判斷驗證是否成功。
var schema = new XmlSchemaSet();
const string xsdFilePath = "../sample.xsd";
schema.Add("", xsdFilePath);
const string xmlFilePath = "../sample.xml";
var xmlDocument = XDocument.Load(xmlFilePath);
var isInvalid = false;
xmlDocument.Validate(schema, (sender, event) =>
{
Console.WriteLine(event.Message);
isInvalid = true;
});
Validate()
會有兩個參數,第一個是要載入的 XmlSchemaSet 驗證物件,第二個是 ValidationEventHandler
,後者比較需要多說明一些。
後者 ValidationEventHandler
是一個委派(詳細資訊),可以有兩個參數,sender 和 event,sender 代表所驗證的物件本身,event 代表驗證過程中發生的事件,通常拿來顯示驗證的錯誤訊息。
而 ValidationEventHandler
這個委派在驗證過程中,如果有發生錯誤才會被執行,而這個委派參數如果設定成 null,則會在驗證發生錯誤時,會吐出執行例外。
請參考
07-ValidateWithXSD
專案的 Program.cs
參考資料: