Creazione e modifica di uno schema XML
Le classi nello spazio dei nomi System.Xml.Schema si associano alle strutture definite nella raccomandazione XML Schema del World Wide Web Consortium (W3C). Dal momento che alcuni elementi dello schema possono avere attributi e contenere elementi figli, le classi corrispondenti nel modello SOM (Schema Object Model) dispongono di proprietà che possono contenere attributi ed elementi figli.
È possibile manipolare uno schema in memoria attraversando il modello SOM e impostando o annullando l'impostazione delle proprietà, per determinare la corrispondenza con la creazione, inserimento o eliminazione di nodi e attributi in un documento di schema. In base alla raccomandazione XML Schema del W3C , il modello di contenuto di uno schema viene indicato come:
Content: ((include | import | redefine | annotation)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation), annotation*)*).
Mentre si aggiungono nuovi elementi al modello SOM, il primo gruppo di elementi nel modello di contenuto (include, import e redefine) deve essere aggiunto all'insieme Schema.Includes e i restanti elementi nel modello di contenuto devono essere aggiunti all'insieme Schema.Items.
Nell'esempio che segue viene creato uno schema XML vuoto, viene modificato lo schema per contenere un elemento, Price
, che ha un tipo di xs:integer
, quindi si modifica lo schema per nidificare un elemento simpleType che ha una base di restrizione di tipo xs:positiveInteger
.
Imports System.IO
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Text
Imports Microsoft.VisualBasic
Public Class EditSOM
Public Shared Sub ValidationCallbackOne(sender As Object, 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 ' ValidationCallbackOne
Public Shared Sub Main()
Dim schema As New XmlSchema()
Console.WriteLine("Printing empty schema...")
schema.Compile(AddressOf ValidationCallbackOne)
schema.Write(Console.Out)
Console.WriteLine(ControlChars.CrLf & ControlChars.CrLf)
Dim priceElem As New XmlSchemaElement()
priceElem.Name = "Price"
priceElem.SchemaTypeName = New XmlQualifiedName("integer", "http://www.w3.org/2001/XMLSchema")
schema.Items.Add(priceElem)
schema.Compile(AddressOf ValidationCallbackOne)
Console.WriteLine("Printing modified schema containing element with type=""integer""")
schema.Write(Console.Out)
Console.WriteLine(ControlChars.CrLf & ControlChars.CrLf)
priceElem.SchemaTypeName = Nothing
Dim PriceType As New XmlSchemaSimpleType()
Dim PriceRestriction As New XmlSchemaSimpleTypeRestriction()
PriceRestriction.BaseTypeName = New XmlQualifiedName("positiveInteger", "http://www.w3.org/2001/XMLSchema")
PriceType.Content = PriceRestriction
Dim maxExclusive As New XmlSchemaMaxExclusiveFacet()
maxExclusive.Value = "100"
PriceRestriction.Facets.Add(maxExclusive)
priceElem.SchemaType = PriceType
schema.Compile(AddressOf ValidationCallbackOne)
Console.WriteLine("Printing modified schema containing element with nested simpleType")
schema.Write(Console.Out)
End Sub 'Main
End Class 'EditSOM
' Main(string[])
' EditSOM
[C#]
using System.IO;
using System;
using System.Xml;
using System.Xml.Schema;
using System.Text;
public class EditSOM {
public static void ValidationCallbackOne(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);
}
public static void Main(string[] args){
XmlSchema schema = new XmlSchema();
Console.WriteLine("Printing empty schema...");
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
schema.Write(Console.Out);
Console.WriteLine("\n\n");
XmlSchemaElement priceElem = new XmlSchemaElement();
priceElem.Name = "Price";
priceElem.SchemaTypeName = new XmlQualifiedName("integer", "http://www.w3.org/2001/XMLSchema");
schema.Items.Add(priceElem);
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
Console.WriteLine("Printing modified schema containing element with type=\"integer\"");
schema.Write(Console.Out);
Console.WriteLine("\n\n");
priceElem.SchemaTypeName = null;
XmlSchemaSimpleType PriceType = new XmlSchemaSimpleType();
XmlSchemaSimpleTypeRestriction PriceRestriction =
new XmlSchemaSimpleTypeRestriction();
PriceRestriction.BaseTypeName =
new XmlQualifiedName("positiveInteger", "http://www.w3.org/2001/XMLSchema");
PriceType.Content = PriceRestriction;
XmlSchemaMaxExclusiveFacet maxExclusive =
new XmlSchemaMaxExclusiveFacet();
maxExclusive.Value = "100";
PriceRestriction.Facets.Add(maxExclusive);
priceElem.SchemaType = PriceType;
schema.Compile(new ValidationEventHandler(ValidationCallbackOne));
Console.WriteLine("Printing modified schema containing element with nested simpleType");
schema.Write(Console.Out);
}/* Main(string[]) */
}// EditSOM
L'output che segue è generato dall'esempio di codice precedente.
Printing empty schema...
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
</schema>
Printing modified schema containing element with type="integer"
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="Price" type="integer"/>
</schema>
Printing modified schema containing element with nested simpleType
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:apo="http://www.example.com/PO1">
<element name="Price">
<simpleType>
<restiction base="positiveInteger">
<maxExclusive="100" />
</restriction>
</simpleType>
</element>
</schema>
Vedere anche
SOM (Schema Object Model) XML | Riferimento agli schemi XML (XSD) | Spazio dei nomi System.Xml.Schema