Leer fragmentos de XML con XmlValidatingReader

Actualización: November 2007

La clase XmlValidatingReader puede leer fragmentos de XML al analizar una cadena como un fragmento de XML.

Nota:

La clase XmlValidatingReader es obsoleta en .NET Framework versión 2.0. Se puede crear una instancia de validación XmlReader mediante la clase XmlReaderSettings y el método Create. Para obtener más información, vea Validación de datos XML con XmlReader.

Clase XmlParserContext

La clase XmlParserContext se utiliza para construir un objeto XmlValidatingReader con la información de contexto requerida para analizar un fragmento o documento XML. La clase XmlParserContext puede proporcionar información como XmlNameTable para utilizar, el ámbito del espacio de nombres, la definición del tipo de documento (DTD), la codificación, y el ámbito actual xml:lang y xml:space.

Cuando se construye el objeto XmlValidatingReader, también debe especificar el tipo de nodo XML. El tipo de nodo XML determina si los datos serán analizados como fragmento o como documento XML con formato correcto. En la tabla siguiente se enumeran los tipos de nodo y qué tipo de datos espera recibir el analizador. Al analizar cualquier otro valorXmlNodeType se inicia ArgumentException.

Tipo

El fragmento contiene

Elemento

Cualquier elemento válido, incluso una combinación de elementos, comentarios, instrucciones de procesamiento, CDATA y texto.

Una declaración XML también puede producirse como el primer nodo. Esto le permite especificar la codificación para el fragmento XML.

Attribute

Valor de un atributo.

Documento

Contenido de un documento XML completo. Este tipo exige las reglas de documento con formato correcto XML.

Las referencias de entidades que se encuentran en el contenido de elementos o de atributos se procesan según el marcador EntityHandling. Puede analizar información DTD que se utiliza para resolver entidades y añadir atributos predeterminados mediante la clase XmlParserContext.

El constructor XmlParserContext que contiene el subconjunto de DTD interna, pública, literal y literal de sistema es necesario si 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.

ArgumentException ocurre si la propiedad ValidationType se establece en DTD y XmlParserContext no contiene ninguna propiedad DTD.

Ejemplo

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
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
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

Conceptos

Leer fragmentos de XML con XmlReader

Otros recursos

Uso de la clase XmlReader