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
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).
Seleccione el tipo de archivo XML y, a continuación, haga clic en Abrir.
Agregue los siguientes datos al documento XML para representar un producto en un catálogo:
<Product ProductID="123"> <ProductName>Rugby jersey</ProductName> </Product>
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
).
Creación de una DTD y vínculo al documento XML
En Visual Studio 2005 o en Visual Studio .NET, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Archivo.
Seleccione el tipo de archivo de texto y, a continuación, haga clic en Abrir.
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)>
Guarde el archivo como Product.dtd en la misma carpeta que el documento XML.
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">
Guarde el documento XML modificado como ProductWithDTD.xml.
Realizar la validación mediante una DTD
En Visual Studio 2005 o en Visual Studio .NET, cree un nuevo proyecto de aplicación de consola de Visual Basic denominado ValidateXmlUsingVB.
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)
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
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)
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
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
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
isValid
False (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
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
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
Creación de un esquema XDR y vínculo al documento XML
En Visual Studio 2005 o en Visual Studio .NET, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Archivo.
Seleccione el tipo de archivo de texto y, a continuación, haga clic en Abrir.
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>
Guarde el archivo como Product.xdr en la misma carpeta que el documento XML.
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>
Guarde el documento XML modificado como ProductWithXDR.xml.
Realizar la validación mediante un esquema XDR
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")
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
Compile y ejecute la aplicación.
La aplicación debe informar de que el documento XML es válido.
Modifique ProductWithXDR.xml para que no sea válida deliberadamente.
Vuelva a ejecutar la aplicación.
La aplicación debe notificar un error de validación.
Creación de un esquema XSD y vínculo al documento XML
En Visual Studio .NET, seleccione Nuevo en el menú Archivo y, a continuación, haga clic en Archivo.
Seleccione el tipo de archivo de texto y, a continuación, haga clic en Abrir.
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>
Guarde el archivo como Product.xsd en la misma carpeta que el documento XML.
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>
Guarde el documento XML modificado como ProductWithXSD.xml.
Realizar la validación mediante un esquema XSD
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")
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
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
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>
Guarde ProductWithXSD.xml.
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">
Guarde Product.xsd.
Ejecute la aplicación para validar el documento XML mediante el esquema XSD.
Espacios de nombres de caché
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()
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")
Después del código que crea el
XmlValidatingReader
objeto, agregue la siguiente instrucción. Esto agrega la caché de esquemas aXmlValidatingReader
, para que el lector pueda usar los esquemas en memoria.v.Schemas.Add(cache)
Verificación
- Compile y ejecute la aplicación.
- Compruebe que el documento XML se sigue validando con el esquema XSD.
- Realice algunos cambios en la ProductWithXSD.xml para que no sea válida deliberadamente.
- Compruebe que la aplicación detecta estos errores de validación.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de