共用方式為


使用 XmlValidatingReader 對 XML 結構描述 (XSD) 進行驗證

更新: November 2007

XML 結構描述定義語言 (XSD) 結構描述驗證是使用在全球資訊網協會 (W3C) XML 結構描述建議事項中定義的有效性條件約束實作的。Microsoft .NET Framework 支援 W3C XML Schema 2001 Recommendation。所有 XML 結構描述都必須包含命名空間 http://www.w3c.org/2001/XMLSchema。

每個 XML 結構描述都與命名空間統一資源識別項 (URI) 相關。XmlValidatingReader 可使用繫結至 XML 結構描述執行個體命名空間 http://www.w3.org/2001/XMLSchema-instance 之資料檔案中的 XML 結構描述 (XSD) schemaLocation 屬性。如果結構描述儲存於 XmlSchemaCollection 中,則 XmlValidatingReader 會使用將結構描述加入集合時所指定的命名空間 URI。這通常是結構描述的目標命名空間。

XmlValidatingReader 會使用 schemaLocation 屬性來識別 XML 結構描述。例如,下列程式碼顯示資料檔案的根項目。

<bookstore xmlns="urn:bookstore-schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:bookstore-schema books.xsd">
注意事項:

XmlValidatingReader 類別在 .NET Framework 2.0 版 中已過時。您可以使用 XmlReaderSettings 類別和 Create 方法,來建立驗證 XmlReader 執行個體。如需詳細資訊,請參閱 使用 XmlReader 驗證 XML 資料

範例

下列程式碼範例會建立 XmlValidatingReader,其會使用 XmlTextReader。輸入檔 HeadCount.xml 會對 XML 結構描述 HeadCount.xsd 檔案進行驗證。

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.ValidationType = ValidationType.Schema
         AddHandler vr.ValidationEventHandler, AddressOf ValidationHandler
         
         While vr.Read()
            PrintTypeInfo(vr)
            If vr.NodeType = XmlNodeType.Element Then
               While vr.MoveToNextAttribute()
                  PrintTypeInfo(vr)
               End While
            End If
         End While
         Console.WriteLine("Validation finished")
      End Sub
      ' Main
      
      
      Public Shared Sub PrintTypeInfo(vr As XmlValidatingReader)
         If Not (vr.SchemaType Is Nothing) Then
            If TypeOf vr.SchemaType Is XmlSchemaDatatype Or TypeOf vr.SchemaType Is XmlSchemaSimpleType Then
               Dim value As Object = vr.ReadTypedValue()
               Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value)
            Else
               If TypeOf vr.SchemaType Is XmlSchemaComplexType Then
                  Dim sct As XmlSchemaComplexType = CType(vr.SchemaType, XmlSchemaComplexType)
                  Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name)
               End If
            End If
         End If
      End Sub
      ' PrintTypeInfo
       
      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
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.ValidationType = ValidationType.Schema;
      vr.ValidationEventHandler += new ValidationEventHandler (ValidationHandler);

      while(vr.Read())
      {
        PrintTypeInfo(vr);
        if(vr.NodeType == XmlNodeType.Element)
        {
          while(vr.MoveToNextAttribute())
            PrintTypeInfo(vr);
        }
      }
      Console.WriteLine("Validation finished");
    }

    public static void PrintTypeInfo(XmlValidatingReader vr)
    {
      if(vr.SchemaType != null)
      {
        if(vr.SchemaType is XmlSchemaDatatype || vr.SchemaType is XmlSchemaSimpleType)
        {
          object value = vr.ReadTypedValue();
          Console.WriteLine("{0}({1},{2}):{3}", vr.NodeType, vr.Name, value.GetType().Name, value);
      }
        else if(vr.SchemaType is XmlSchemaComplexType)
            {
               XmlSchemaComplexType sct = (XmlSchemaComplexType)vr.SchemaType;
               Console.WriteLine("{0}({1},{2})", vr.NodeType, vr.Name, sct.Name);
            }
         }
      }

      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) 內容。

<hc:HeadCount xmlns:hc='xsdHeadCount' xsi:schemaLocation='xsdHeadCount HeadCount.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
  <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>

請參閱

概念

使用 XmlReader 讀取 XML

其他資源

使用 XmlReader 類別