星期一, 12月 21, 2020

[C#] 利用 XSD 驗證 XML

根據 使用 XmlSchemaSet 進行 XML 架構 (XSD) 驗證如何使用 XSD 驗證 的測試筆記,該文章內容是以判斷 name、last-name 和 first-name 的 sequence 是否有效

XSD,文章內容有用到功能,從 XML Schema Tutorial 內抓出來整理

類型說明
sequenceThe sequence element specifies that the child elements must appear in a sequence.
Each child element can occur from 0 to any number of times.
minOccursThe minOccurs indicator specifies the minimum number of times an element can occur.
default value 1
maxOccursThe maxOccurs indicator specifies the maximum number of times an element can occur.
useAttributes are optional by default. To specify that the attribute is required, use the "use" attribute
<?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 資料夾內,所以要設定 [複製到輸出目錄:一律複製]

[C#] 利用 XSD 驗證 XML-1
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}");
        }
    }
}
[C#] 利用 XSD 驗證 XML-4

直接在 XML 內操作資料,不符合 XSD 的話,也會有 Intellient Sense 提醒喔,下圖故意把 ISBN 移除

[C#] 利用 XSD 驗證 XML-3

XSD 有專屬設計器,閱讀時都是選擇 [使用 XML 編輯器檢視與編輯基礎 XML 結構描述檔案]

[C#] 利用 XSD 驗證 XML-2

沒有留言:

張貼留言