Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein XML-Schema kann Elemente <xs:import />
<xs:include />
enthalten<xs:redefine />
. Diese Schemaelemente beziehen sich auf andere XML-Schemas, die verwendet werden können, um die Struktur des Schemas zu ergänzen, das sie enthält oder importiert. Die XmlSchemaImportKlassen XmlSchemaInclude und XmlSchemaRedefine Klassen ordnen diese Elemente in der SCHEMA-Objektmodell-API (SOM) zu.
Einschließen oder Importieren eines XML-Schemas
Im folgenden Codebeispiel wird das im Thema "Building XML Schemas " erstellte Kundenschema mit dem Adressschema ergänzt. Durch Die Ergänzung des Kundenschemas mit dem Adressschema werden Adresstypen im Kundenschema verfügbar.
Das Adressschema kann entweder mithilfe <xs:include />
von Elementen oder <xs:import />
Elementen integriert werden, um die Komponenten des Adressschemas as-iszu verwenden, oder mithilfe eines <xs:redefine />
Elements, um eine seiner Komponenten entsprechend den Anforderungen des Kundenschemas zu ändern. Da sich das Adressschema targetNamespace
von dem des Kundenschemas unterscheidet, wird das <xs:import />
Element und daher die Importsemantik verwendet.
Das Codebeispiel enthält das Adressschema in den folgenden Schritten.
Fügt das Kundenschema und das Adressschema zu einem neuen XmlSchemaSet Objekt hinzu und kompiliert sie dann. Alle Warnungen und Fehler bei der Schemaüberprüfung, die beim Lesen oder Kompilieren der Schemas aufgetreten sind, werden vom ValidationEventHandler Delegat behandelt.
Ruft die kompilierten XmlSchema Objekte für die Kunden- und Adressschemas aus dem XmlSchemaSet durch Durchlaufen der Schemas Eigenschaft ab. Da die Schemas kompiliert werden, sind auf post-schema-Compilation-Infoset (PSCI)-Eigenschaften zugegriffen werden kann.
Erstellt ein XmlSchemaImport Objekt, legt die Namespace Eigenschaft des Imports in den Namespace des Adressschemas fest, legt die Schema Eigenschaft des Imports auf das XmlSchema Objekt des Adressschemas fest und fügt den Import der Includes Eigenschaft des Kundenschemas hinzu.
Verarbeitet und kompiliert das geänderte XmlSchema Objekt des Kundenschemas mithilfe Reprocess der Klassen und Compile Methoden XmlSchemaSet und schreibt es in die Konsole.
Schließlich schreibt rekursiv alle im Kundenschema importierten Schemas mithilfe Includes der Eigenschaft des Kundenschemas in die Konsole. Die Includes Eigenschaft bietet Zugriff auf alle Eingeschlossenen, Importe oder Neudefinitionen, die einem Schema hinzugefügt werden.
Im Folgenden sehen Sie das vollständige Codebeispiel und die Kunden- und Adressschemas, die in die Konsole geschrieben wurden.
using System;
using System.Xml;
using System.Xml.Schema;
class XmlSchemaImportExample
{
static void Main(string[] args)
{
// Add the customer and address schemas to a new XmlSchemaSet and compile them.
// Any schema validation warnings and errors encountered reading or
// compiling the schemas are handled by the ValidationEventHandler delegate.
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.ValidationEventHandler += new ValidationEventHandler(ValidationCallback);
schemaSet.Add("http://www.tempuri.org", "customer.xsd");
schemaSet.Add("http://www.example.com/IPO", "address.xsd");
schemaSet.Compile();
// Retrieve the compiled XmlSchema objects for the customer and
// address schema from the XmlSchemaSet by iterating over
// the Schemas property.
XmlSchema customerSchema = null;
XmlSchema addressSchema = null;
foreach (XmlSchema schema in schemaSet.Schemas())
{
if (schema.TargetNamespace == "http://www.tempuri.org")
customerSchema = schema;
else if (schema.TargetNamespace == "http://www.example.com/IPO")
addressSchema = schema;
}
// Create an XmlSchemaImport object, set the Namespace property
// to the namespace of the address schema, the Schema property
// to the address schema, and add it to the Includes property
// of the customer schema.
XmlSchemaImport import = new XmlSchemaImport();
import.Namespace = "http://www.example.com/IPO";
import.Schema = addressSchema;
customerSchema.Includes.Add(import);
// Reprocess and compile the modified XmlSchema object
// of the customer schema and write it to the console.
schemaSet.Reprocess(customerSchema);
schemaSet.Compile();
customerSchema.Write(Console.Out);
// Recursively write all of the schemas imported into the
// customer schema to the console using the Includes
// property of the customer schema.
RecurseExternals(customerSchema);
}
static void RecurseExternals(XmlSchema schema)
{
foreach (XmlSchemaExternal external in schema.Includes)
{
if (external.SchemaLocation != null)
{
Console.WriteLine($"External SchemaLocation: {external.SchemaLocation}");
}
if (external is XmlSchemaImport)
{
XmlSchemaImport import = external as XmlSchemaImport;
Console.WriteLine($"Imported namespace: {import.Namespace}");
}
if (external.Schema != null)
{
external.Schema.Write(Console.Out);
RecurseExternals(external.Schema);
}
}
}
static void ValidationCallback(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.Write("WARNING: ");
else if (args.Severity == XmlSeverityType.Error)
Console.Write("ERROR: ");
Console.WriteLine(args.Message);
}
}
Imports System.Xml
Imports System.Xml.Schema
Class XmlSchemaImportExample
Shared Sub Main()
' Add the customer and address schemas to a new XmlSchemaSet and compile them.
' Any schema validation warnings and errors encountered reading or
' compiling the schemas are handled by the ValidationEventHandler delegate.
Dim schemaSet As XmlSchemaSet = New XmlSchemaSet()
AddHandler schemaSet.ValidationEventHandler, AddressOf ValidationCallback
schemaSet.Add("http://www.tempuri.org", "customer.xsd")
schemaSet.Add("http://www.example.com/IPO", "address.xsd")
schemaSet.Compile()
' Retrieve the compiled XmlSchema objects for the customer and
' address schema from the XmlSchemaSet by iterating over
' the Schemas property.
Dim customerSchema As XmlSchema = Nothing
Dim addressSchema As XmlSchema = Nothing
For Each schema As XmlSchema In schemaSet.Schemas()
If schema.TargetNamespace = "http://www.tempuri.org" Then
customerSchema = schema
ElseIf schema.TargetNamespace = "http://www.example.com/IPO" Then
addressSchema = schema
End If
Next
' Create an XmlSchemaImport object, set the Namespace property
' to the namespace of the address schema, the Schema property
' to the address schema, and add it to the Includes property
' of the customer schema.
Dim import As XmlSchemaImport = New XmlSchemaImport()
import.Namespace = "http://www.example.com/IPO"
import.Schema = addressSchema
customerSchema.Includes.Add(import)
' Reprocess and compile the modified XmlSchema object
' of the customer schema and write it to the console.
schemaSet.Reprocess(customerSchema)
schemaSet.Compile()
customerSchema.Write(Console.Out)
' Recursively write all of the schemas imported into the
' customer schema to the console using the Includes
' property of the customer schema.
RecurseExternals(customerSchema)
End Sub
Shared Sub RecurseExternals(ByVal schema As XmlSchema)
For Each external As XmlSchemaExternal In Schema.Includes
If Not external.SchemaLocation = Nothing Then
Console.WriteLine("External SchemaLocation: {0}", external.SchemaLocation)
End If
If external.GetType() Is GetType(XmlSchemaImport) Then
Dim import As XmlSchemaImport = CType(external, XmlSchemaImport)
Console.WriteLine("Imported namespace: {0}", import.Namespace)
End If
If Not external.Schema Is Nothing Then
external.Schema.Write(Console.Out)
RecurseExternals(external.Schema)
End If
Next
End Sub
Shared Sub ValidationCallback(ByVal sender As Object, ByVal args As ValidationEventArgs)
If args.Severity = XmlSeverityType.Warning Then
Console.Write("WARNING: ")
Else
If args.Severity = XmlSeverityType.Error Then
Console.Write("ERROR: ")
End If
End If
Console.WriteLine(args.Message)
End Sub
End Class
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://www.tempuri.org" targetNamespace="http://www.tempuri.org" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://www.example.com/IPO" />
<xs:element name="Customer">
<xs:complexType>
<xs:sequence>
<xs:element name="FirstName" type="xs:string" />
<xs:element name="LastName" type="tns:LastNameType" />
</xs:sequence>
<xs:attribute name="CustomerId" type="xs:positiveInteger" use="required" />
</xs:complexType>
</xs:element>
<xs:simpleType name="LastNameType">
<xs:restriction base="xs:string">
<xs:maxLength value="20" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
<schema targetNamespace="http://www.example.com/IPO" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:ipo="http://www.example.com/IPO">
<annotation>
<documentation xml:lang="en">
Addresses for International Purchase order schema
Copyright 2000 Example.com. All rights reserved.
</documentation>
</annotation>
<complexType name="Address">
<sequence>
<element name="name" type="string"/>
<element name="street" type="string"/>
<element name="city" type="string"/>
</sequence>
</complexType>
<complexType name="USAddress">
<complexContent>
<extension base="ipo:Address">
<sequence>
<element name="state" type="ipo:USState"/>
<element name="zip" type="positiveInteger"/>
</sequence>
</extension>
</complexContent>
</complexType>
<!-- other Address derivations for more countries or regions -->
<simpleType name="USState">
<restriction base="string">
<enumeration value="AK"/>
<enumeration value="AL"/>
<enumeration value="AR"/>
<!-- and so on ... -->
</restriction>
</simpleType>
</schema>
Weitere Informationen zu den <xs:import />
Elementen <xs:include />
und <xs:redefine />
Elementen und XmlSchemaImportXmlSchemaInclude Klassen sowie XmlSchemaRedefine zu den Klassen finden Sie in der Referenzdokumentation zum W3C-XML-Schema und zur System.Xml.Schema Namespaceklassenreferenz.