Share via


Kelas System.Xml.Schema.XmlSchemaSet

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Penting

  • Jangan gunakan skema dari sumber atau lokasi yang tidak diketahui atau tidak tepercaya. Melakukannya akan membahayakan keamanan kode Anda.
  • Skema XML (termasuk skema sebaris) secara inheren rentan terhadap penolakan serangan layanan; jangan menerimanya dalam skenario yang tidak tepercaya.
  • Pesan dan pengecualian kesalahan validasi skema dapat mengekspos informasi sensitif tentang jalur con mode tenda l atau URI ke file skema. Berhati-hatilah untuk tidak mengekspos informasi ini kepada penelepon yang tidak tepercaya.
  • Pertimbangan keamanan tambahan tercakup di bagian "Pertimbangan Keamanan".

XmlSchemaSet adalah cache atau pustaka tempat Anda dapat menyimpan skema bahasa definisi Skema XML (XSD). XmlSchemaSet meningkatkan performa dengan menyimpan skema dalam memori alih-alih mengaksesnya dari file atau URL. Setiap skema diidentifikasi oleh URI namespace layanan dan lokasi yang ditentukan saat skema ditambahkan ke set. Anda menggunakan XmlReaderSettings.Schemas properti untuk menetapkan XmlSchemaSet objek yang harus digunakan pembaca XML untuk validasi data.

Pertimbangan keamanan

  • Jangan gunakan skema dari sumber yang tidak diketahui atau tidak tepercaya. Melakukannya akan membahayakan keamanan kode Anda. Namespace atau lokasi eksternal yang dirujuk termasuk, mengimpor, dan menentukan ulang elemen skema diselesaikan sehubungan dengan URI dasar skema yang mencakup atau mengimpornya. Misalnya, jika URI dasar termasuk atau mengimpor skema kosong atau null, lokasi eksternal diselesaikan sehubungan dengan direktori saat ini. Kelas XmlUrlResolver digunakan untuk mengatasi skema eksternal secara default. Untuk menonaktifkan resolusi elemen sertakan, impor, dan tentukan ulang skema, atur XmlSchemaSet.XmlResolver properti ke null.

  • Kelas XmlSchemaSet menggunakan System.Text.RegularExpressions.Regex kelas untuk mengurai dan mencocokkan ekspresi reguler dalam skema XML. Validasi faset pola dengan ekspresi reguler dalam skema XML dapat melibatkan peningkatan penggunaan CPU dan harus dihindari dalam skenario ketersediaan tinggi.

  • Pengecualian yang dimunculkan sebagai akibat dari penggunaan XmlSchemaSet kelas, seperti XmlSchemaException kelas mungkin berisi informasi sensitif yang tidak boleh diekspos dalam skenario yang tidak tepercaya. Misalnya, SourceUri properti dari XmlSchemaException mengembalikan jalur URI ke file skema yang menyebabkan pengecualian. Properti SourceUri tidak boleh diekspos dalam skenario yang tidak tepercaya. Pengecualian harus ditangani dengan benar sehingga informasi sensitif ini tidak terekspos dalam skenario yang tidak tepercaya.

Contoh

Contoh berikut memvalidasi file XML menggunakan skema yang disimpan di XmlSchemaSet. Namespace dalam file XML, urn:bookstore-schema, mengidentifikasi skema mana dalam yang XmlSchemaSet akan digunakan untuk validasi. Output dari contoh menunjukkan bahwa file XML memiliki dua pelanggaran skema:

  • Elemen buku pertama berisi elemen penulis> tetapi tidak ada <elemen judul> atau <harga>.<<>

  • Elemen <penulis> dalam elemen buku> terakhir <tidak memiliki <elemen nama> depan dan <nama> belakang dan sebaliknya memiliki elemen nama> yang tidak <valid.

using System;
using System.Xml;
using System.Xml.Schema;
using System.IO;

public class Sample
{
  public static void Main() {

    // Create the XmlSchemaSet class.
    XmlSchemaSet sc = new XmlSchemaSet();

    // Add the schema to the collection.
    sc.Add("urn:bookstore-schema", "books.xsd");

    // Set the validation settings.
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
    settings.Schemas = sc;
    settings.ValidationEventHandler += ValidationCallBack;

    // Create the XmlReader object.
    XmlReader reader = XmlReader.Create("booksSchemaFail.xml", settings);

    // Parse the file.
    while (reader.Read());
  }

  // Display any validation errors.
  private static void ValidationCallBack(object sender, ValidationEventArgs e) {
    Console.WriteLine($"Validation Error:\n   {e.Message}\n");
  }
}
// The example displays output like the following:
//   Validation Error:
//        The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author'
//        in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in
//        namespace 'urn:bookstore-schema'.
//
//    Validation Error:
//       The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name'
//       in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in
//       namespace 'urn:bookstore-schema'.
Imports System.Xml
Imports System.Xml.Schema
Imports System.IO

Public Module Sample 
  Public Sub Main() 

    ' Create the XmlSchemaSet class.
    Dim sc as XmlSchemaSet = new XmlSchemaSet()

    ' Add the schema to the collection.
    sc.Add("urn:bookstore-schema", "books.xsd")

    ' Set the validation settings.
    Dim settings as XmlReaderSettings = new XmlReaderSettings()
    settings.ValidationType = ValidationType.Schema
    settings.Schemas = sc
    AddHandler settings.ValidationEventHandler, AddressOf ValidationCallBack
 
    ' Create the XmlReader object.
    Dim reader as XmlReader = XmlReader.Create("booksSchemaFail.xml", settings)

    ' Parse the file. 
    While reader.Read()
    End While
    
  End Sub

  ' Display any validation errors.
  Private Sub ValidationCallBack(sender as object, e as ValidationEventArgs) 
    Console.WriteLine($"Validation Error:{vbCrLf}   {e.Message}")
    Console.WriteLine()
  End Sub
End Module
' The example displays output like the following:
'   Validation Error: 
'        The element 'book' in namespace 'urn:bookstore-schema' has invalid child element 'author' 
'        in namespace 'urn:bookstore-schema'. List of possible elements expected: 'title' in 
'        namespace 'urn:bookstore-schema'.
'
'    Validation Error: 
'       The element 'author' in namespace 'urn:bookstore-schema' has invalid child element 'name' 
'       in namespace 'urn:bookstore-schema'. List of possible elements expected: 'first-name' in 
'       namespace 'urn:bookstore-schema'.

Input

Sampel menggunakan dua file input berikut.

booksSchemaFail.xml:

<?xml version='1.0'?>
<bookstore xmlns="urn:bookstore-schema">
  <book>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
  </book>
  <book genre="novel">
    <title>The Confidence Man</title>
    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </book>
  <book genre="philosophy">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

books.xsd:

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

 <xsd:element name="bookstore" type="bookstoreType"/>

 <xsd:complexType name="bookstoreType">
  <xsd:sequence maxOccurs="unbounded">
   <xsd:element name="book"  type="bookType"/>
  </xsd:sequence>
 </xsd:complexType>

 <xsd:complexType name="bookType">
  <xsd:sequence>
   <xsd:element name="title" type="xsd:string"/>
   <xsd:element name="author" type="authorName"/>
   <xsd:element name="price"  type="xsd:decimal"/>
  </xsd:sequence>
  <xsd:attribute name="genre" type="xsd:string"/>
 </xsd:complexType>

 <xsd:complexType name="authorName">
  <xsd:sequence>
   <xsd:element name="first-name"  type="xsd:string"/>
   <xsd:element name="last-name" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>

</xsd:schema>