Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Con la XmlDocument clase , puede validar el contenido XML contenido contenido en un XmlDocument objeto de dos maneras. La primera forma es validar el contenido XML mediante un objeto de validación XmlReader y la segunda es usar el Validate método de la XmlDocument clase . También puede realizar la validación de solo lectura del contenido XML mediante la XPathDocument clase .
Validación de datos XML
La XmlDocument clase no valida por defecto un documento XML ni mediante DTD ni mediante la definición de esquema XML (XSD). Solo comprueba que el documento XML tiene un formato correcto.
La primera forma de validar un documento XML consiste en validarlo a medida que se carga en un objeto XmlDocument utilizando un objeto XmlReader de validación. La segunda forma consiste en validar un documento XML que previamente no tenga información de tipos utilizando el método Validate de la clase XmlDocument. En ambos casos, los cambios realizados en el documento XML validado se pueden volver a validar mediante el Validate método de la XmlDocument clase .
Validar un documento a medida que se carga
Para crear un objeto de validación XmlReader , se pasa un XmlReaderSettings objeto al Create método de la XmlReader clase que toma un XmlReaderSettings objeto como parámetro. El XmlReaderSettings objeto pasado como parámetro tiene la propiedad ValidationType establecida en Schema
y un esquema XML para el documento XML contenido en el objeto XmlDocument agregado a la propiedad Schemas. A continuación, el objeto de validación XmlReader se usa para crear el XmlDocument objeto .
En el siguiente ejemplo, se valida el archivo contosoBooks.xml
a medida que se carga en el objeto XmlDocument, creando el objeto XmlDocument utilizando un objeto XmlReader de validación. Dado que el documento XML es válido según su esquema, no se generan errores ni advertencias de validación de esquema.
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;
}
}
}
En el ejemplo se toma el contosoBooks.xml
archivo como entrada.
<?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>
El ejemplo también toma el contosoBooks.xsd
como entrada.
<?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>
En el ejemplo anterior, se lanzará una excepción XmlSchemaValidationException al llamar a Load si algún atributo o tipo de elemento no coincide con el tipo correspondiente definido en el esquema que valida. Si se establece un ValidationEventHandler en la validación XmlReader, se llamará a ValidationEventHandler cuando se encuentre un tipo no válido.
Se producirá una XmlSchemaException siempre que el TypedValue obtenga acceso a un atributo o elemento con invalid
establecido en XPathNavigator.
La Validity propiedad se puede usar para determinar si un atributo o elemento individual es válido al tener acceso a atributos o elementos con .XPathNavigator
Nota:
Cuando se carga un documento XML en un XmlDocument objeto con un esquema asociado que define los valores predeterminados, el XmlDocument objeto trata estos valores predeterminados como si aparecieran en el documento XML. Esto significa que la IsEmptyElement propiedad siempre devuelve false
para un elemento predeterminado del esquema, incluso si en el documento XML se escribió como un elemento vacío.
Validación de un documento mediante el método Validate
El método Validate de la clase XmlDocument valida el documento XML contenido en un objeto XmlDocument con los esquemas especificados en la propiedad XmlDocument del objeto Schemas y realiza la ampliación del conjunto de información. El resultado es que se reemplaza un documento XML que previamente no tiene información de tipos del objeto XmlDocument por un documento con información de tipos.
El objeto XmlDocument notifica errores y advertencias de validación de esquema mediante el delegado ValidationEventHandler pasado como parámetro al método Validate.
En el ejemplo siguiente se valida el archivo contosoBooks.xml
contenido en el objeto XmlDocument contra el esquema contosoBooks.xsd
contenido en la propiedad XmlDocument del objeto 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;
}
}
}
En el ejemplo se toma el contosoBooks.xml
archivo como entrada.
<?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>
El ejemplo también toma el contosoBooks.xsd
como entrada.
<?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>
Validación de modificaciones
Después de realizar modificaciones en un documento XML, puede validar las modificaciones en el esquema del documento XML mediante el Validate método de la XmlDocument clase .
En el siguiente ejemplo, se valida el archivo contosoBooks.xml
a medida que se carga en el objeto XmlDocument, creando el objeto XmlDocument utilizando un objeto XmlReader de validación. El documento XML se valida correctamente, ya que se carga sin generar errores o advertencias de validación de esquemas. A continuación, el ejemplo realiza dos modificaciones en el documento XML que no son válidos según el contosoBooks.xsd
esquema. La primera modificación inserta un elemento hijo no válido, lo que da como resultado un error de validación de esquema. La segunda modificación establece el valor de un nodo tipificado en un valor que no es válido según el tipo del nodo, lo que produce una excepción.
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;
}
}
}
En el ejemplo se toma el contosoBooks.xml
archivo como entrada.
<?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>
El ejemplo también toma el contosoBooks.xsd
como entrada.
<?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>
En el ejemplo anterior, se realizan dos modificaciones en el documento XML contenido en el XmlDocument objeto . A medida que se cargó el documento XML, cualquier error de validación de esquema detectado habría sido controlado por el método de controlador de eventos de validación y escrito en la consola.
En este ejemplo, los errores de validación se introdujeron después de cargar el documento XML y se encontraron mediante el Validate método de la XmlDocument clase .
Las modificaciones realizadas mediante el SetTypedValue método de la XPathNavigator clase provocaron un InvalidCastException porque el nuevo valor no era válido según el tipo de esquema del nodo.
Para obtener más información sobre cómo modificar valores mediante el SetTypedValue método , vea el tema Modificar datos XML mediante XPathNavigator .
Validación de solo lectura
La XPathDocument clase es una representación en memoria de solo lectura de un documento XML. Tanto la XPathDocument clase como la XmlDocument clase crean XPathNavigator objetos para navegar y editar documentos XML. Dado que la clase XPathDocument es de solo lectura, los objetos XPathNavigator devueltos desde los objetos XPathDocument no pueden editar el documento XML contenido en el objeto XPathDocument.
En el caso de la validación, puede crear un objeto de XPathDocument tal como crearía un objeto de XmlDocument utilizando un objeto de validación XmlReader, tal como se describe anteriormente en este tema. El XPathDocument objeto valida el documento XML a medida que se carga, pero dado que no se pueden editar los datos XML del XPathDocument objeto, no se puede volver a validar el documento XML.
Para obtener más información sobre los objetos editables XPathNavigator y de solo lectura, vea el tema Lectura de datos XML mediante XPathDocument y XmlDocument .
Consulte también
- XmlDocument
- XPathDocument
- XPathNavigator
- Procesar datos XML mediante el modelo de datos XPath
- Lectura de datos XML mediante XPathDocument y XmlDocument
- Selección, evaluación y coincidencia de datos XML mediante XPathNavigator
- Acceso a datos XML mediante XPathNavigator
- Edición de datos XML mediante XPathNavigator