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.
La clase XmlValidatingReader puede leer fragmentos de XML mediante el análisis de una cadena determinada como fragmento de XML, lo que le permite omitir las reglas del nivel de raíz para documentos XML con un formato correcto.
El método XmlValidatingReader es el equivalente para validación del XmlTextReader utilizado para construir fragmentos de documentos. El parámetro XmlNodeType determina cómo se analiza la cadena. En la tabla siguiente se demuestra cómo se analiza cada tipo.
| Tipo | El fragmento contiene |
|---|---|
| Element | Cualquier elemento válido, incluso una combinación de elementos, comentarios, instrucciones de procesamiento, CDATA y texto. |
| Attribute | Valor de un atributo. |
| Document | Contenido de todo un documento XML. Este tipo impone las reglas del nivel de raíz. |
Las referencias de entidades que se encuentran en el contenido de elementos o de atributos se procesan según el indicador EntityHandling. Puede pasar información de la DTD (Document Type Definition, definición de tipo de documento) utilizada para resolver entidades y agregar atributos predeterminados mediante la clase XmlParserContext. Si se pasa cualquier otra enumeración XmlNodeType, se inicia una excepción ArgumentException.
El constructor XmlParserContext que contiene el subconjunto de DTD interna, pública, literal y literal de sistema es necesario si el valor de la propiedad ValidationType es DTD o Auto, y hay que resolver entidades y agregar atributos predeterminados. Para todos los demás tipos de validación, se puede suministrar XmlParserContext sin propiedades de DTD (como esquemas). Cualquier esquema utilizado para validar el fragmento de XML debe agregarse a XmlSchemaCollection o referirse a él directamente dentro del fragmento de XML. XmlParserContext se utiliza para proporcionar más información (por ejemplo, de resolución de espacio de nombres, información de DTD, etcétera), necesaria para analizar fragmentos de XML.
La excepción ArgumentException se produce si el valor de la propiedad ValidationType se establece como DTD y XmlParserContext no contiene propiedades de DTD.
En el ejemplo de código siguiente se utiliza XmlValidatingReader para leer fragmentos de XML y escribirlos en la consola.
Imports System
Imports System.Xml
Public Class Sample
Overloads Public Shared Sub Main(args() As [String])
Dim vr As New XmlValidatingReader("<element1> abc </element1> <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, Nothing)
While vr.Read()
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
End While
End Sub
' Main
End Class
' Sample
[C#]
using System;
using System.Xml;
public class Sample
{
public static void Main (String[] args)
{
XmlValidatingReader vr = new XmlValidatingReader("<element1> abc </element1> <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, null);
while(vr.Read())
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
}
}
En el código de ejemplo siguiente se lee un fragmento de XML mediante XmlParserContext para proporcionar el espacio de nombres necesario a partir de XmlNamespaceManager.
Imports System
Imports System.IO
Imports System.Xml
Public Class Sample
Public Shared Sub Main()
Dim xmlFrag As String = "<book><bk:genre>&n;</bk:genre></book>"
Dim nt As New NameTable()
Dim nsmanager As New XmlNamespaceManager(nt)
' Add a default namespace.
nsmanager.AddNamespace(String.Empty, "www.microsoft.com")
nsmanager.AddNamespace("bk", "www.microsoft.com/books")
Dim internalContent As String = "<!ENTITY n 'novel'>"
Dim context As New XmlParserContext(nt, nsmanager, "elem", Nothing, Nothing, internalContent, String.Empty, String.Empty, XmlSpace.None)
Dim r As New XmlValidatingReader(xmlFrag, XmlNodeType.Element, context)
r.ValidationType = ValidationType.None
r.EntityHandling = EntityHandling.ExpandEntities
While r.Read()
Console.WriteLine("{0},{1},{2}", r.NodeType, r.Name, r.Value)
End While
End Sub
' Main
End Class
' Sample
[C#]
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
string xmlFrag = "<book><bk:genre>&n;</bk:genre></book>";
NameTable nt = new NameTable();
XmlNamespaceManager nsmanager = new XmlNamespaceManager(nt);
// Add a default namespace.
nsmanager.AddNamespace (string.Empty, "www.microsoft.com");
nsmanager.AddNamespace ("bk", "www.microsoft.com/books");
string internalContent = "<!ENTITY n 'novel'>";
XmlParserContext context = new XmlParserContext(nt, nsmanager, "elem",null, null, internalContent, string.Empty,
string.Empty, XmlSpace.None);
XmlValidatingReader r = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
r.ValidationType = ValidationType.None;
r.EntityHandling = EntityHandling.ExpandEntities;
while(r.Read())
Console.WriteLine("{0},{1},{2}",r.NodeType, r.Name, r.Value);
}
}
El análisis de fragmentos no es posible cuando el valor de la propiedad ValidationType se establece como DTD ya que, por definición, una DTD necesita que se cargue todo el documento para realizar la validación.
Vea también
Validación de XML con XmlValidatingReader | Validación de XML con esquemas | XmlSchemaCollection como caché del esquema | XmlParserContext (Clase)