Convalidare un documento XML usando DTD, XDR o XSD in Visual Basic

Questo articolo illustra come usare la XmlValidatingReader classe per convalidare un documento XML rispetto a un DTD, uno schema XDR o uno schema XSD in Visual Basic 2005 o in Visual Basic .NET. Descrive anche come ottimizzare la convalida memorizzando nella cache gli schemi.

Versione originale del prodotto: Visual Basic
Numero KB originale: 315533

Riepilogo

I documenti XML (Extensible Markup Language) contengono elementi e attributi e offrono un modo flessibile e potente per scambiare dati tra applicazioni e organizzazioni. Per specificare la struttura e il contenuto consentiti di un documento XML, è possibile scrivere uno schema DTD (Document Type Definition), uno schema XDR (Microsoft XML-Data Reduced) o uno schema XSD (XML Schema Definition Language).

Gli schemi XSD sono il modo preferito per specificare grammatiche XML in .NET Framework, ma sono supportati anche gli schemi DTD e XDR.

Questo articolo illustra come applicare un DTD, uno schema XDR o uno schema XSD a un documento XML in Microsoft Visual Basic 2005 o in Microsoft Visual Basic .NET. Si apprenderà quindi come usare la classe XmlValidatingReader per convalidare un documento XML rispetto alla grammatica specificata. Si apprenderà anche come usare la classe XmlSchemaCollection per memorizzare nella cache gli schemi in memoria per ottimizzare la convalida XML.

Requisiti

L'elenco seguente descrive l'hardware, il software, l'infrastruttura di rete e i Service Pack consigliati necessari: Microsoft Visual Basic 2005 o Microsoft Visual Basic .NET

Questo articolo fa riferimento agli spazi dei nomi della libreria di classi di Microsoft .NET Framework seguenti:

  • System.Xml
  • System.Xml.Schema

Questo articolo presuppone che si abbia familiarità con gli argomenti seguenti:

  • Sintassi .NET di Visual Basic 2005 o Visual Basic
  • Concetti XML, inclusi i problemi di convalida

Creare un documento XML

  1. Avviare Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET. Creare quindi un nuovo file XML (scegliere Nuovo dal menu File e quindi fare clic su File).

  2. Selezionare il tipo di file XML e quindi fare clic su Apri.

  3. Aggiungere i dati seguenti al documento XML per rappresentare un prodotto in un catalogo:

    <Product ProductID="123">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  4. Salvare il file come Product.xml in una cartella a cui sarà possibile accedere facilmente in un secondo momento (gli esempi di codice in questo articolo presuppongono una cartella denominata C:\MyFolder).

  1. In Visual Studio 2005 o in Visual Studio .NET scegliere Nuovo dal menu File e quindi fare clic su File.

  2. Selezionare il tipo di file di testo e quindi fare clic su Apri.

  3. Aggiungere le dichiarazioni DTD seguenti al file per descrivere la grammatica del documento XML:

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    
  4. Salvare il file come Product.dtd nella stessa cartella del documento XML.

  5. Riaprire Product.xml in Visual Studio 2005 o in Visual Studio .NET; a tale scopo, scegliere Apri dal menu File e quindi fare clic su File. Aggiungere un'istruzione DOCTYPE (sotto la ?xml version="1.0" riga), come indicato di seguito. In questo modo il documento XML viene collegato al file DTD).

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    
  6. Salvare il documento XML modificato come ProductWithDTD.xml.

Eseguire la convalida usando un DTD

  1. In Visual Studio 2005 o in Visual Studio .NET creare un nuovo progetto di applicazione console di Visual Basic denominato ValidateXmlUsingVB.

  2. Visual Studio 2005 o Visual Studio .NET visualizza un nuovo file denominato Module1.vb. All'inizio di questo file aggiungere due istruzioni Imports, come indicato di seguito:

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. In Module1 (prima dell'inizio della subroutine Main) dichiarare una variabile booleana denominata isValid, come indicato di seguito:

    'If a validation error occurs,
    ' you will set this flag to False 
    ' in the validation event handler. 
    Private isValid As Boolean = True
    
  4. Nella subroutine Main creare un oggetto XmlTextReader per leggere un documento XML da un file di testo. Creare quindi un XmlValidatingReader oggetto per convalidare questi dati XML:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml")
    Dim v As New XmlValidatingReader(r)
    
  5. L'oggetto XmlValidatingReader ha una proprietà ValidationType, che indica il tipo di convalida richiesto (DTD, XDR o Schema). Impostare questa proprietà su DTD, come indicato di seguito:

    v.ValidationType = ValidationType.DTD
    
  6. Se si verificano errori di convalida, il lettore di convalida genera un evento di convalida. Aggiungere il codice seguente per registrare un gestore eventi di convalida (si implementerà la subroutine MyValidationEventHandler nel passaggio 8 di questa sezione):

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. Aggiungere il codice seguente per leggere e convalidare il documento XML. Se si verificano errori di convalida, verrà chiamato MyValidationEventHandler per gestire l'errore. Questa subroutine verrà impostata su isValidFalse (vedere il passaggio 8 di questa sezione). È possibile controllare lo stato di isValid dopo la convalida per verificare se il documento è valido o non valido.

    While v.Read()' Could add code here to process the content.
    End While
    v.Close()' Check whether the document is valid or invalid.
    If isValid Then
        Console.WriteLine("Document is valid")
    Else
        Console.WriteLine("Document is invalid")
    End If
    
  8. Dopo la subroutine Main, scrivere la subroutine MyValidationEventHandler, come indicato di seguito:

    Public Sub MyValidationEventHandler(ByVal sender As Object, _
     ByVal args As ValidationEventArgs)
         isValid = False
         Console.WriteLine("Validation event" & vbCrLf & args.Message)
    End Sub
    
  9. Compilare ed eseguire l'applicazione.

L'applicazione deve segnalare che il documento XML è valido. 10. In Visual Studio 2005 o in Visual Studio .NET modificare ProductWithDTD.xml in modo che non sia valido(ad esempio, eliminare l'elemento ProductName Rugby jersey/ ProductName ). 11. Eseguire di nuovo l'applicazione.

L'applicazione deve visualizzare il messaggio di errore seguente:

Il contenuto dell'elemento dell'evento di convalida 'Product' è incompleto. Previsto 'ProductName'. Si è verificato un errore in file:///C:/MyFolder/ProductWithDTD.xml(4, 3). Documento non valido

  1. In Visual Studio 2005 o in Visual Studio .NET scegliere Nuovo dal menu File e quindi fare clic su File.

  2. Selezionare il tipo di file di testo e quindi fare clic su Apri.

  3. Aggiungere le definizioni di schema XDR seguenti al file per descrivere la grammatica del documento XML:

    <?xml version="1.0"?>
    <Schema name="ProductSchema" 
     xmlns="urn:schemas-microsoft-com:xml-data"
     xmlns:dt="urn:schemas-microsoft-com:datatypes">
    
        <AttributeType name="ProductID" dt:type="int"/>
        <ElementType name="ProductName" dt:type="string"/>
    
        <ElementType name="Product" content="eltOnly">
            <attribute type="ProductID" required="yes"/>
            <element type="ProductName"/>
        </ElementType>
    </Schema>
    
  4. Salvare il file come Product.xdr nella stessa cartella del documento XML.

  5. Riaprire il Product.xmloriginale e quindi collegarlo allo schema XDR, come indicato di seguito:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. Salvare il documento XML modificato come ProductWithXDR.xml.

Eseguire la convalida usando uno schema XDR

  1. Modificare l'applicazione in modo che XmlTextReader carichi ProductWithXDR.xml, come indicato di seguito:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
    
  2. Impostare su ValidationType XDR in modo che il lettore di convalida esegua la convalida XDR, come indicato di seguito:

    v.ValidationType = ValidationType.XDR
    
  3. Compilare ed eseguire l'applicazione.

    L'applicazione deve segnalare che il documento XML è valido.

  4. Modificare ProductWithXDR.xml per renderlo deliberatamente non valido.

  5. Eseguire di nuovo l'applicazione.

    L'applicazione deve segnalare un errore di convalida.

  1. In Visual Studio .NET scegliere Nuovo dal menu File e quindi fare clic su File.

  2. Selezionare il tipo di file di testo e quindi fare clic su Apri.

  3. Aggiungere la definizione dello schema XSD seguente al file per descrivere la grammatica del documento XML:

    <?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="Product">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="ProductName" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="ProductID" use="required" type="xsd:int"/>
        </xsd:complexType>
        </xsd:element>
    </xsd:schema>
    
  4. Salvare il file come Product.xsd nella stessa cartella del documento XML.

  5. Riaprire il Product.xmloriginale e quindi collegarlo allo schema XSD, come indicato di seguito:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. Salvare il documento XML modificato come ProductWithXSD.xml.

Eseguire la convalida usando uno schema XSD

  1. Modificare l'applicazione in modo che carichi ProductWithXSD.xmlXmlTextReader , come indicato di seguito:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
    
  2. Impostare su ValidationType Schema in modo che il lettore di convalida esegua la convalida dello schema XSD, come indicato di seguito:

    v.ValidationType = ValidationType.Schema
    
  3. Compilare ed eseguire l'applicazione per convalidare il documento XML usando lo schema XSD.

    L'applicazione deve segnalare che il documento XML è valido.

Usare gli spazi dei nomi nello schema XSD

  1. In Visual Studio 2005 o in Visual Studio .NET aprire ProductWithXSD.xml. Dichiarare uno spazio dei nomi predefinito, urn:MyNamespace, nel documento. Modificare il collegamento XSD per specificare lo schema XSD per convalidare il contenuto in questo spazio dei nomi, come indicato di seguito:

    <?xml version="1.0" encoding="utf-8"?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="urn:MyNamespace"
     xsi:schemaLocation="urn:MyNamespace Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  2. Salvare ProductWithXSD.xml.

  3. Aprire Product.xsd, fare clic sulla scheda XML e quindi modificare il tag di avvio xsd:schema come indicato di seguito, in modo che lo schema si applichi allo spazio dei nomi urn:MyNamespace:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="urn:MyNamespace"
     elementFormDefault="qualified">
    
  4. Salvare Product.xsd.

  5. Eseguire l'applicazione per convalidare il documento XML usando lo schema XSD.

Spazi dei nomi della cache

  1. In Visual Studio 2005 o in Visual Studio .NET aprire Module1.vb. All'inizio della subroutine Main creare un XmlSchemaCollection oggetto come indicato di seguito:

    Dim cache As New XmlSchemaCollection()
    
  2. L'oggetto XmlSchemaCollection consente di memorizzare nella cache gli schemi in memoria per migliorare le prestazioni. Ogni schema è associato a uno spazio dei nomi diverso. Aggiungere il codice seguente per memorizzare nella cache Product.xsd:

    cache.Add("urn:MyNamespace", "C:\MyFolder\Product.xsd")
    
  3. Dopo il codice che crea l'oggetto XmlValidatingReader , aggiungere l'istruzione seguente. In questo modo la cache dello schema viene aggiunta a XmlValidatingReader , in modo che il lettore possa usare gli schemi in memoria.

    v.Schemas.Add(cache)
    

Verifica

  1. Compilare ed eseguire l'applicazione.
  2. Verificare che il documento XML sia ancora in fase di convalida rispetto allo schema XSD.
  3. Apportare alcune modifiche al ProductWithXSD.xml per renderlo intenzionalmente non valido.
  4. Verificare che l'applicazione rilevi questi errori di convalida.