Cómo: Validar fragmentos XML con un esquema XML en .NET de Visual C#

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte 317463 .

EN ESTA TAREA

Resumen

En este artículo se describe paso a paso cómo utilizar objetos de XmlValidatingReader y XMLSchemaCollection para validar un fragmento de lenguaje de marcado Extensible (XML) con un esquema XML.


XmlValidatingReader implementa la clase XmlReader y proporciona compatibilidad para la validación de datos XML. La propiedad Schemas de XmlValidatingReader conecta el lector a los archivos de esquema almacenados en caché en XmlSchemaCollection. La propiedad ValidationType de XmlValidatingReader especifica el tipo de validación que debe realizar el lector. Si la propiedad se establece en ValidationType.None, se crea un lector no validadores.


Sólo puede agregar esquemas de lenguaje de definición de esquemas XML (XSD) y esquemas reducidos de datos XML (XDR) a XmlSchemaCollection. Utilice el método Add con un URI de espacio de nombres para cargar los esquemas. Los esquemas XML, el URI de espacio de nombres típica es la propiedad targetNamespace del esquema.


Requisitos

La lista siguiente describe el hardware recomendado, software, infraestructura de red y los service packs que necesita:
  • Microsoft Visual Studio .NET instalado en un sistema operativo de Microsoft Windows compatible
En este artículo se supone que está familiarizado con los temas siguientes:
  • .NET Visual C#
  • Normas básicas de XML
  • Esquemas XSD

Crear un esquema XSD

Pegue el código siguiente en un nuevo archivo de texto denominado C:\Books.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:bookstore-schema" elementFormDefault="qualified" targetNamespace="urn:bookstore-schema"><xsd:element name="bookstore" type="bookstoreType" />
<xsd:element name="comment" type="xsd:string" />
<xsd:element name="author" type="authorName"/>
<xsd:complexType name="authorName">
<xsd:sequence>
<xsd:element name="first-name" type="xsd:string" />
<xsd:element name="last-name" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bookstoreType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="book" type="bookType" />
<xsd:element ref="comment" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="bookType">
<xsd:sequence>
<xsd:element name="title" type="xsd:string" />
<xsd:element ref="author" />
<xsd:element name="price" type="xsd:decimal" />
</xsd:sequence>
<xsd:attribute name="genre" type="xsd:string" />
</xsd:complexType>

</xsd:schema>

Cree una aplicación de Visual C#.

  1. Cree una nueva aplicación de consola de .NET de Visual C#.
  2. Reemplace el código en Class1.cs con el código siguiente:
    using System;using System.Xml;
    using System.Xml.Schema;


    namespace ConsoleApplication3
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    System.Boolean m_success;

    [STAThread]
    static void Main(string[] args)
    {
    //
    // TODO: Add code to start application here.
    //
    XmlValidatingReader reader = null;
    XmlSchemaCollection myschema = new XmlSchemaCollection();
    ValidationEventHandler eventHandler = new ValidationEventHandler(Class1.ShowCompileErrors );


    try
    {
    //Create the XML fragment to be parsed.
    String xmlFrag = "<author xmlns='urn:bookstore-schema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" +
    "<first-name>Herman</first-name>" +
    "<last-name>Melville</last-name>" +
    "</author>";

    //Create the XmlParserContext.
    XmlParserContext context = new XmlParserContext(null, null, "", XmlSpace.None);

    //Implement the reader.
    reader = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
    //Add the schema.
    myschema.Add("urn:bookstore-schema", "c:\\Books.xsd");

    //Set the schema type and add the schema to the reader.
    reader.ValidationType = ValidationType.Schema;
    reader.Schemas.Add(myschema);

    while (reader.Read())
    {
    }

    Console.WriteLine("Completed validating xmlfragment");
    }
    catch (XmlException XmlExp)
    {
    Console.WriteLine(XmlExp.Message);
    }
    catch(XmlSchemaException XmlSchExp)
    {
    Console.WriteLine(XmlSchExp.Message);
    }
    catch(Exception GenExp)
    {
    Console.WriteLine(GenExp.Message);
    }
    finally
    {
    Console.Read();
    }

    }
    public static void ShowCompileErrors(object sender, ValidationEventArgs args)
    {
    Console.WriteLine("Validation Error: {0}", args.Message);
    }

    }
    }

  3. Cuando se muestra el mensaje siguiente en la ventana de salida, el fragmento de XML es un elemento válido:
    Completed validating xmlfragment

Nota: sólo las declaraciones de tipo y los elementos de nivel superior en el esquema XML se validan con un esquema XML. Subelementos se consideran como locales y, por tanto, no se puede validar. Para validar un subelemento, declara un elemento de nivel superior y a se refieren.


Referencias

Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:

307379 Cómo: validar un documento XML mediante DTD, XDR o XSD en Visual C# .NET
313826 INFO: Guía básica para los esquemas XML en el.NET Framework
313651 INFO: Guía básica para XML en el.NET Framework
Para obtener información adicional, consulte los siguientes sitios Web de MSDN:
Propiedades

Id. de artículo: 318504 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios