XSD,文章內容有用到功能,從 XML Schema Tutorial 內抓出來整理
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
XML,文章內有故意弄成不符合 XSD 之處,已經寫在備註內<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<!--沒有 name,故意把 Last-Name 和 First-Name 打反-->
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<!--沒有 name,故意把 Last-Name 和 First-Name 打反-->
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<!--沒有 Last-Name 和 First-Name,此為有效-->
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
測試 C# Code,為方便測試,會直接輸出 XSD 和 XML 在 debug 資料夾內,所以要設定 [複製到輸出目錄:一律複製]using System;
using System.Xml.Linq;
using System.Xml.Schema;
using System.IO;
namespace XSDValid
{
class Program
{
static void Main(string[] args)
{
// xml 和 xsd 必須設定 [複製到輸出目錄:一律複製]
string xmlFilName = "BookStoreError.xml";
string xmlPath = Path.Combine(Directory.GetCurrentDirectory(), xmlFilName) ;
string xsdPath = Path.Combine(Directory.GetCurrentDirectory(), "BookStore.xsd");
XDocument xDoc = XDocument.Load(xmlPath);
XmlSchemaSet xSchemaSet = new XmlSchemaSet();
xSchemaSet.Add(null, xsdPath);
bool IsValidError = false;
string ErrorMessage = "無";
xDoc.Validate(xSchemaSet, (sender, eventArgs) =>
{
ErrorMessage = $"Severity:{eventArgs.Severity}-Message:{eventArgs.Message}";
IsValidError = true;
});
string result = IsValidError ? "失敗" : "成功";
Console.WriteLine($"{xmlFilName } 驗證 {result} { Environment.NewLine} 錯誤訊息:{ErrorMessage}");
}
}
}
直接在 XML 內操作資料,不符合 XSD 的話,也會有 Intellient Sense 提醒喔,下圖故意把 ISBN 移除
沒有留言:
張貼留言