Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usando la XmlDocument classe , è possibile convalidare il contenuto XML contenuto in un XmlDocument oggetto in due modi. Il primo consiste nel convalidare il contenuto XML usando un oggetto di convalida XmlReader e il secondo consiste nell'utilizzare il Validate metodo della XmlDocument classe . È anche possibile eseguire la convalida di sola lettura del contenuto XML usando la XPathDocument classe .
Convalida dei dati XML
La classe XmlDocument non convalida un documento XML usando la convalida degli schemi DTD o XSD (linguaggio di definizione dello schema XML) per impostazione predefinita. Verifica solo che il documento XML sia ben formato.
Il primo modo per convalidare un documento XML consiste nel convalidare il documento durante il caricamento in un XmlDocument oggetto utilizzando un oggetto di convalida XmlReader . Il secondo modo consiste nel convalidare un documento XML non tipizzato in precedenza usando il Validate metodo della XmlDocument classe . In entrambi i casi, le modifiche apportate al documento XML convalidato possono essere riconvalidate usando il Validate metodo della XmlDocument classe .
Convalida di un documento durante il caricamento
Un oggetto di convalida XmlReader viene creato passando un XmlReaderSettings oggetto al Create metodo della XmlReader classe che accetta un XmlReaderSettings oggetto come parametro. L'oggetto XmlReaderSettings passato come parametro ha una ValidationType proprietà impostata su Schema e un XML Schema per il documento XML contenuto nell'oggetto XmlDocument aggiunto alla relativa Schemas proprietà. L'oggetto di convalida XmlReader viene quindi utilizzato per creare l'oggetto XmlDocument .
Nell'esempio seguente, il file contosoBooks.xml viene convalidato durante il caricamento nell'oggetto XmlDocument creando l'oggetto XmlDocument utilizzando un oggetto di convalida XmlReader. Poiché il documento XML è valido in base allo schema, non vengono generati errori o avvisi di convalida dello schema.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidatingReaderExample
Shared Sub Main(ByVal args() As String)
Try
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
Catch e As Exception
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)
End Try
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidatingReaderExample
{
static void Main(string[] args)
{
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
}
catch (Exception e)
{
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);
}
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
L'esempio accetta il contosoBooks.xml file come input.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<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" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
L'esempio accetta anche contosoBooks.xsd come input.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Nell'esempio precedente, viene generata un'eccezione XmlSchemaValidationException quando Load viene chiamato se un attributo o un tipo di elemento non corrisponde al tipo corrispondente specificato nello schema di convalida. Se un ValidationEventHandler è impostato sul XmlReader di convalida, il ValidationEventHandler verrà chiamato ogni volta che viene rilevato un tipo non valido.
Verrà generata un'eccezione XmlSchemaException quando un attributo o un elemento con TypedValue impostato su invalid è accessibile da XPathNavigator.
La Validity proprietà può essere utilizzata per determinare se un singolo attributo o elemento è valido quando si accede a attributi o elementi con .XPathNavigator
Annotazioni
Quando un documento XML viene caricato in un XmlDocument oggetto con uno schema associato che definisce i valori predefiniti, l'oggetto XmlDocument considera queste impostazioni predefinite come se apparissero nel documento XML. Ciò significa che la IsEmptyElement proprietà restituisce false sempre per un elemento predefinito dallo schema, anche se nel documento XML è stato scritto come elemento vuoto.
Convalida di un documento tramite il metodo Validate
Il Validate metodo della XmlDocument classe convalida il documento XML contenuto in un XmlDocument oggetto rispetto agli schemi specificati nella XmlDocument proprietà dell'oggetto Schemas ed esegue l'aumento dell'infoset. Il risultato è un documento XML non tipizzato in precedenza nell'oggetto XmlDocument sostituito con un documento tipizzato.
L'oggetto XmlDocument segnala errori di convalida dello schema e avvisi usando il ValidationEventHandler delegato passato come parametro al Validate metodo .
Nell'esempio seguente viene convalidato il contosoBooks.xml file contenuto nell'oggetto XmlDocument rispetto allo contosoBooks.xsd schema contenuto nella XmlDocument proprietà dell'oggetto Schemas .
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidateExample
Shared Sub Main(ByVal args() As String)
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)
document.Validate(validation)
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidateExample
{
static void Main(string[] args)
{
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
document.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);
document.Validate(validation);
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
L'esempio accetta il contosoBooks.xml file come input.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<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" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
L'esempio accetta anche contosoBooks.xsd come input.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Convalida delle modifiche
Dopo aver apportato modifiche a un documento XML, è possibile convalidare le modifiche rispetto allo schema per il documento XML usando il Validate metodo della XmlDocument classe .
Nell'esempio seguente, il file contosoBooks.xml viene convalidato durante il caricamento nell'oggetto XmlDocument creando l'oggetto XmlDocument utilizzando un oggetto di convalida XmlReader. Il documento XML viene convalidato correttamente mentre viene caricato senza generare errori o avvisi di convalida dello schema. Nell'esempio vengono quindi apportate due modifiche al documento XML non valide in base allo contosoBooks.xsd schema. La prima modifica inserisce un elemento figlio non valido che genera un errore di convalida dello schema e la seconda modifica imposta il valore di un nodo tipizzato su un valore non valido in base al tipo del nodo che genera un'eccezione.
Imports System
Imports System.Xml
Imports System.Xml.Schema
Imports System.Xml.XPath
Class ValidatingReaderExample
Shared Sub Main(ByVal args() As String)
Try
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim validation As ValidationEventHandler = New ValidationEventHandler(AddressOf SchemaValidationHandler)
navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("author", "http://www.contoso.com/books")
navigator.AppendChild("<title>Book Title</title>")
document.Validate(validation)
navigator.MoveToParent()
navigator.MoveToChild("price", "http://www.contoso.com/books")
navigator.SetTypedValue(DateTime.Now)
Catch e As Exception
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message)
End Try
End Sub
Shared Sub SchemaValidationHandler(ByVal sender As Object, ByVal e As ValidationEventArgs)
Select Case e.Severity
Case XmlSeverityType.Error
Console.WriteLine("Schema Validation Error: {0}", e.Message)
Exit Sub
Case XmlSeverityType.Warning
Console.WriteLine("Schema Validation Warning: {0}", e.Message)
Exit Sub
End Select
End Sub
End Class
using System;
using System.Xml;
using System.Xml.Schema;
using System.Xml.XPath;
class ValidatingReaderExample
{
static void Main(string[] args)
{
try
{
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
ValidationEventHandler validation = new ValidationEventHandler(SchemaValidationHandler);
navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("author", "http://www.contoso.com/books");
navigator.AppendChild("<title>Book Title</title>");
document.Validate(validation);
navigator.MoveToParent();
navigator.MoveToChild("price", "http://www.contoso.com/books");
navigator.SetTypedValue(DateTime.Now);
}
catch (Exception e)
{
Console.WriteLine("ValidatingReaderExample.Exception: {0}", e.Message);
}
}
static void SchemaValidationHandler(object sender, ValidationEventArgs e)
{
switch (e.Severity)
{
case XmlSeverityType.Error:
Console.WriteLine("Schema Validation Error: {0}", e.Message);
break;
case XmlSeverityType.Warning:
Console.WriteLine("Schema Validation Warning: {0}", e.Message);
break;
}
}
}
L'esempio accetta il contosoBooks.xml file come input.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://www.contoso.com/books">
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<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" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
L'esempio accetta anche contosoBooks.xsd come input.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Nell'esempio precedente vengono apportate due modifiche al documento XML contenuto nell'oggetto XmlDocument . Durante il caricamento del documento XML, tutti gli errori di convalida dello schema rilevati sarebbero stati gestiti dal metodo del gestore eventi di convalida e scritti nella console.
In questo esempio, gli errori di convalida sono stati introdotti dopo il caricamento del documento XML e sono stati trovati usando il Validate metodo della XmlDocument classe .
Le modifiche apportate usando il SetTypedValue metodo della XPathNavigator classe hanno generato un oggetto InvalidCastException perché il nuovo valore non è valido in base al tipo di schema del nodo.
Per ulteriori informazioni sulla modifica dei valori tramite il metodo SetTypedValue, vedere l'argomento Modificare i dati XML utilizzando XPathNavigator.
Convalida Read-Only
La XPathDocument classe è una rappresentazione in memoria di sola lettura di un documento XML. Sia la XPathDocument classe che la XmlDocument classe creano XPathNavigator oggetti per spostarsi e modificare documenti XML. Poiché la XPathDocument classe è una classe di sola lettura, XPathNavigator gli oggetti restituiti da XPathDocument oggetti non possono modificare il documento XML contenuto nell'oggetto XPathDocument .
In caso di convalida, è possibile creare un XPathDocument oggetto esattamente come si crea un XmlDocument oggetto usando un oggetto di XmlReader convalida come descritto in precedenza in questo argomento. L'oggetto XPathDocument convalida il documento XML durante il caricamento, ma poiché non è possibile modificare i dati XML nell'oggetto XPathDocument , non è possibile riconvalidare il documento XML.
Per altre informazioni sugli oggetti di sola lettura e modificabili XPathNavigator , vedere l'argomento Lettura di dati XML tramite XPathDocument e XmlDocument .
Vedere anche
- XmlDocument
- XPathDocument
- XPathNavigator
- Elaborare dati XML usando il modello di dati XPath
- Lettura di dati XML con XPathDocument e XmlDocument
- Selezione, valutazione e corrispondenza di dati XML tramite XPathNavigator
- Accesso ai dati XML tramite XPathNavigator
- Modifica di dati XML con XPathNavigator