共用方式為


使用 XmlSchemaCollection 的 XML 結構描述 (XSD) 驗證

您可使用 XmlSchemaCollection 來針對 XML 結構描述定義語言 (XSD) 結構描述驗證 XML 文件。XmlSchemaCollection 會將結構描述儲存在集合中,如此每次執行驗證時就不會將它們載入記憶體,因而能夠提升效能。如果結構描述存在於結構描述集合中,則會使用 schemaLocation 屬性來查詢集合中的結構描述。

下列程式碼範例顯示資料檔案的根項目。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="urn:bookstore-schema"
    elementFormDefault="qualified"
    targetNamespace="urn:bookstore-schema">

在這個範例中,targetNamespace 屬性的值為 urn:bookstore-schema,這是當將結構描述加入 XmlSchemaCollection 時使用的相同命名空間。

下列程式碼範例會將 XML 結構描述加入 XmlSchemaCollection 中。

Dim xsc As New XmlSchemaCollection()
' XML Schema.
xsc.Add("urn:bookstore-schema", schema) 
reader = New XmlTextReader(filename)
vreader = New XmlValidatingReader(reader)
vreader.Schemas.Add(xsc)
[C#]
XmlSchemaCollection xsc = new XmlSchemaCollection();
// XML Schema.
xsc.Add("urn:bookstore-schema", schema);
reader = new XmlTextReader (filename);
vreader = new XmlValidatingReader (reader);
vreader.Schemas.Add(xsc);

通常使用 targetNamespace 屬性的時機是當您將 namespaceURI 屬性加入至 XmlSchemaCollectionAdd 方法時。您可在將結構描述加入 XmlSchemaCollection 之前指定 Null 參考。沒有命名空間的結構描述應使用空字串 ("")。XmlSchemaCollection 只能有一個不具命名空間的結構描述。

下列程式碼範例會將 XML 結構描述 HeadCount.xsd 加入 XmlSchemaCollection 中並驗證 HeadCount.xml。

Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Schema

Namespace ValidationSample
   
   Class Sample
      
      Public Shared Sub Main()
         Dim tr As New XmlTextReader("HeadCount.xml")
         Dim vr As New XmlValidatingReader(tr)
         
         vr.Schemas.Add("xsdHeadCount", "HeadCount.xsd")
         vr.ValidationType = ValidationType.Schema
         AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
         
         While vr.Read()
         End While
         Console.WriteLine("Validation finished")
      End Sub
      ' Main
      
      
      Public Shared Sub ValidationHandler(sender As Object, args As ValidationEventArgs)
         Console.WriteLine("***Validation error")
         Console.WriteLine("Severity:{0}", args.Severity)
         Console.WriteLine("Message:{0}", args.Message)
      End Sub
      ' ValidationHandler
   End Class
   ' Sample
End Namespace
' ValidationSample
[C#]
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;

namespace ValidationSample
{
   class Sample
   {
      public static void Main()
      {
         XmlTextReader tr = new XmlTextReader("HeadCount.xml");
         XmlValidatingReader vr = new XmlValidatingReader(tr);

         vr.Schemas.Add("xsdHeadCount", "HeadCount.xsd");
         vr.ValidationType = ValidationType.Schema;
         vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);

         while(vr.Read());
         Console.WriteLine("Validation finished");
      }

      public static void ValidationHandler(object sender, ValidationEventArgs args)
      {
         Console.WriteLine("***Validation error");
         Console.WriteLine("\tSeverity:{0}", args.Severity);
         Console.WriteLine("\tMessage  :{0}", args.Message);
      }
   }
}

以下列出了要進行驗證的輸入檔 (HeadCount.xml) 內容。

<!--Load HeadCount.xsd in SchemaCollection for Validation-->
<hc:HeadCount xmlns:hc='xsdHeadCount'>
   <Name>Waldo Pepper</Name>
   <Name>Red Pepper</Name>
</hc:HeadCount>

以下列出了要進行驗證 XML 結構描述檔案 (HeadCount.xsd) 的內容。

<xs:schema xmlns="xsdHeadCount" targetNamespace="xsdHeadCount" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name='HeadCount' type="HEADCOUNT"/>
   <xs:complexType name="HEADCOUNT">
      <xs:sequence>
         <xs:element name='Name' type='xs:string' maxOccurs='unbounded'/>
      </xs:sequence>
      <xs:attribute name='division' type='xs:int' use='optional' default='8'/>
   </xs:complexType>
</xs:schema>

下列程式碼範例會建立使用 XmlTextReaderXmlValidatingReader。輸入檔 sample4.xml 會對 XML 結構描述 sample4.xsd 進行驗證。

Dim tr As New XmlTextReader("sample4.xml")
Dim vr As New XmlValidatingReader(tr)
vr.ValidationType = ValidationType.Schema
vr.Schemas.Add("datatypesTest", "sample4.xsd")
AddHandler vr.ValidationEventHandler, AddressOf ValidationCallBack
While vr.Read()
   Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
End While
[C#]
XmlTextReader tr = new XmlTextReader("sample4.xml");
XmlValidatingReader vr = new XmlValidatingReader(tr);
vr.ValidationType = ValidationType.Schema;
        vr.Schemas.Add("datatypesTest", "sample4.xsd");
vr.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
while(vr.Read()) {
    Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
    }

以下列出了要進行驗證輸入檔 (sample4.xml) 的內容。

<datatypes xmlns="datatypesTest">
    <number>
        <number_1>123</number_1>
    </number>
</datatypes>

以下列出了要進行驗證 XML 結構描述檔案 (sample4.xsd) 的內容。

<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="datatypesTest" 
    targetNamespace="datatypesTest"
    elementFormDefault="qualified">

<xs:element name = "datatypes">
  <xs:complexType>
    <xs:all>
        <xs:element name="number">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="number_1" type="xs:decimal" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:all>
  </xs:complexType>
</xs:element>
</xs:schema>

請參閱

當作結構描述快取的 XmlSchemaCollection | 使用結構描述驗證 XML | XmlParserContext 類別 | XmlValidatingReader.ValidationEventHandler 事件 | XmlValidatingReader.Schemas 屬性