Validación de un documento XML mediante DTD, XDR o XSD en Visual Basic

En este artículo se muestra cómo usar la XmlValidatingReader clase para validar un documento XML con una DTD, un esquema XDR o un esquema XSD en Visual Basic 2005 o en Visual Basic .NET. También se describe cómo optimizar la validación mediante el almacenamiento en caché de esquemas.

Versión original del producto: Visual Basic
Número de KB original: 315533

Resumen

Los documentos del Lenguaje de marcado extensible (XML) contienen elementos y atributos, y proporcionan una manera flexible y eficaz de intercambiar datos entre aplicaciones y organizaciones. Para especificar la estructura permitida y el contenido de un documento XML, puede escribir una definición de tipo de documento (DTD), un esquema de Microsoft XML-Data reducido (XDR) o un esquema de lenguaje de definición de esquema XML (XSD).

Los esquemas XSD son la forma preferida de especificar gramáticas XML en .NET Framework, pero también se admiten los esquemas DTD y XDR.

En este artículo, aprenderá a aplicar una DTD, un esquema XDR o un esquema XSD a un documento XML en Microsoft Visual Basic 2005 o en Microsoft Visual Basic .NET. A continuación, aprenderá a usar la clase XmlValidatingReader para validar un documento XML con la gramática especificada. También aprenderá a usar la clase XmlSchemaCollection para almacenar en caché los esquemas en la memoria como una manera de optimizar la validación XML.

Requisitos

En la lista siguiente se describen el hardware, el software, la infraestructura de red y los Service Pack recomendados que necesita: Microsoft Visual Basic 2005 o Microsoft Visual Basic .NET

En este artículo se hace referencia a los siguientes espacios de nombres de la biblioteca de clases de Microsoft .NET Framework:

  • System.Xml
  • System.Xml.Schema

En este artículo se supone que está familiarizado con los temas siguientes:

  • Sintaxis de Visual Basic 2005 o Visual Basic .NET
  • Conceptos XML, incluidos problemas de validación

Creación de un documento XML

  1. Inicie Microsoft Visual Studio 2005 o Microsoft Visual Studio .NET. A continuación, cree un nuevo archivo XML (en el menú Archivo, seleccione Nuevo y, a continuación, haga clic en Archivo).

  2. Seleccione el tipo de archivo XML y, a continuación, haga clic en Abrir.

  3. Agregue los siguientes datos al documento XML para representar un producto en un catálogo:

    <Product ProductID="123">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  4. Guarde el archivo como Product.xml en una carpeta a la que podrá acceder fácilmente más adelante (los ejemplos de código de este artículo asumen una carpeta denominada C:\MyFolder).

  1. En Visual Studio 2005 o en Visual Studio .NET, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Archivo.

  2. Seleccione el tipo de archivo de texto y, a continuación, haga clic en Abrir.

  3. Agregue las siguientes declaraciones DTD al archivo para describir la gramática del documento XML:

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    
  4. Guarde el archivo como Product.dtd en la misma carpeta que el documento XML.

  5. Vuelva a abrirProduct.xml en Visual Studio 2005 o en Visual Studio .NET; Para ello, seleccione Abrir en el menú Archivo y, a continuación, haga clic en Archivo. Agregue una instrucción DOCTYPE (debajo de la ?xml version="1.0" línea), como se indica a continuación. Esto vincula el documento XML al archivo DTD).

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    
  6. Guarde el documento XML modificado como ProductWithDTD.xml.

Realizar la validación mediante una DTD

  1. En Visual Studio 2005 o en Visual Studio .NET, cree un nuevo proyecto de aplicación de consola de Visual Basic denominado ValidateXmlUsingVB.

  2. Visual Studio 2005 o Visual Studio .NET muestra un nuevo archivo denominado Module1.vb. Al principio de este archivo, agregue dos instrucciones Imports, como se indica a continuación:

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. En Module1 (antes del inicio de la subrutina Main), declare una variable booleana denominada isValid, como se indica a continuación:

    'If a validation error occurs,
    ' you will set this flag to False 
    ' in the validation event handler. 
    Private isValid As Boolean = True
    
  4. En la subrutina Main, cree un objeto XmlTextReader para leer un documento XML desde un archivo de texto. A continuación, cree un XmlValidatingReader objeto para validar estos datos XML:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml")
    Dim v As New XmlValidatingReader(r)
    
  5. El objeto XmlValidatingReader tiene una propiedad ValidationType, que indica el tipo de validación necesaria (DTD, XDR o Schema). Establezca esta propiedad en DTD, como se indica a continuación:

    v.ValidationType = ValidationType.DTD
    
  6. Si se produce algún error de validación, el lector de validación genera un evento de validación. Agregue el código siguiente para registrar un controlador de eventos de validación (implementará la subrutina MyValidationEventHandler en el paso 8 de esta sección):

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. Agregue el código siguiente para leer y validar el documento XML. Si se produce algún error de validación, se llamará a MyValidationEventHandler para controlar el error. Esta subrutina se establecerá en isValidFalse (consulte el paso 8 de esta sección). Puede comprobar el estado de isValid después de la validación para ver si el documento es válido o no válido.

    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. Después de la subrutina Main, escriba la subrutina MyValidationEventHandler, como se indica a continuación:

    Public Sub MyValidationEventHandler(ByVal sender As Object, _
     ByVal args As ValidationEventArgs)
         isValid = False
         Console.WriteLine("Validation event" & vbCrLf & args.Message)
    End Sub
    
  9. Compile y ejecute la aplicación.

La aplicación debe informar de que el documento XML es válido. 10. En Visual Studio 2005 o en Visual Studio .NET, modifique ProductWithDTD.xml para que no sea válido (por ejemplo, elimine el elemento ProductName Rugby jersey/ ProductName ). 11. Vuelva a ejecutar la aplicación.

La aplicación debe mostrar el siguiente mensaje de error:

El elemento de evento de validación "Product" tiene contenido incompleto. Se esperaba "ProductName". Error en file:///C:/MyFolder/ProductWithDTD.xml(4, 3). El documento no es válido

  1. En Visual Studio 2005 o en Visual Studio .NET, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Archivo.

  2. Seleccione el tipo de archivo de texto y, a continuación, haga clic en Abrir.

  3. Agregue las siguientes definiciones de esquema XDR al archivo para describir la gramática 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. Guarde el archivo como Product.xdr en la misma carpeta que el documento XML.

  5. Vuelva a abrir el Product.xmloriginal y, a continuación, vincúlelo al esquema XDR, como se indica a continuación:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. Guarde el documento XML modificado como ProductWithXDR.xml.

Realizar la validación mediante un esquema XDR

  1. Modifique la aplicación para que XmlTextReader cargue ProductWithXDR.xml, como se indica a continuación:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
    
  2. Establezca en ValidationType XDR para que el lector de validación realice la validación XDR, como se indica a continuación:

    v.ValidationType = ValidationType.XDR
    
  3. Compile y ejecute la aplicación.

    La aplicación debe informar de que el documento XML es válido.

  4. Modifique ProductWithXDR.xml para que no sea válida deliberadamente.

  5. Vuelva a ejecutar la aplicación.

    La aplicación debe notificar un error de validación.

  1. En Visual Studio .NET, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Archivo.

  2. Seleccione el tipo de archivo de texto y, a continuación, haga clic en Abrir.

  3. Agregue la siguiente definición de esquema XSD al archivo para describir la gramática 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. Guarde el archivo como Product.xsd en la misma carpeta que el documento XML.

  5. Vuelva a abrir el Product.xmloriginal y, a continuación, vincúlelo al esquema XSD, como se indica a continuación:

    <?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. Guarde el documento XML modificado como ProductWithXSD.xml.

Realizar la validación mediante un esquema XSD

  1. Modifique la aplicación para que las XmlTextReader cargas ProductWithXSD.xml, como se indica a continuación:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
    
  2. Establezca en ValidationType Esquema para que el lector de validación realice la validación del esquema XSD, como se indica a continuación:

    v.ValidationType = ValidationType.Schema
    
  3. Compile y ejecute la aplicación para validar el documento XML mediante el esquema XSD.

    La aplicación debe informar de que el documento XML es válido.

Uso de espacios de nombres en el esquema XSD

  1. En Visual Studio 2005 o en Visual Studio .NET, abra ProductWithXSD.xml. Declare un espacio de nombres predeterminado, urn:MyNamespace, en el documento. Modifique la vinculación XSD para especificar el esquema XSD para validar el contenido de este espacio de nombres, como se indica a continuación:

    <?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. Guarde ProductWithXSD.xml.

  3. Abra Product.xsd, haga clic en la pestaña XML y, a continuación, modifique la etiqueta de inicio xsd:schema de la siguiente manera, para que el esquema se aplique al espacio de nombres urn:MyNamespace:

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

  5. Ejecute la aplicación para validar el documento XML mediante el esquema XSD.

Espacios de nombres de caché

  1. En Visual Studio 2005 o en Visual Studio .NET, abra Module1.vb. Al principio de la subrutina Main, cree un XmlSchemaCollection objeto, como se indica a continuación:

    Dim cache As New XmlSchemaCollection()
    
  2. El XmlSchemaCollection objeto permite almacenar en caché los esquemas en memoria para mejorar el rendimiento. Cada esquema está asociado a un espacio de nombres diferente. Agregue el código siguiente para almacenar en caché Product.xsd:

    cache.Add("urn:MyNamespace", "C:\MyFolder\Product.xsd")
    
  3. Después del código que crea el XmlValidatingReader objeto, agregue la siguiente instrucción. Esto agrega la caché de esquemas a XmlValidatingReader , para que el lector pueda usar los esquemas en memoria.

    v.Schemas.Add(cache)
    

Verificación

  1. Compile y ejecute la aplicación.
  2. Compruebe que el documento XML se sigue validando con el esquema XSD.
  3. Realice algunos cambios en la ProductWithXSD.xml para que no sea válida deliberadamente.
  4. Compruebe que la aplicación detecta estos errores de validación.