Compartir a través de


Resolver entidades con XmlValidatingReader

La propiedad EntityHandling define la forma en que XmlValidatingReader controla las entidades.

ExpandEntities

Si el valor de la propiedad EntityHandling se establece como ExpandEntities, XmlValidatingReader expande todas las entidades en el documento XML. Dado que el texto de la entidad se expande, no aparece XmlNodeType de EntityReference. Éste es el valor predeterminado.

ExpandCharEntities

Si el valor de la propiedad EntityHandling se establece como ExpandCharEntities, XmlValidatingReader expande las entidades de caracteres y devuelve las entidades generales como tipos de nodos EntityReference (NodeType = XmlNodeType.EntityReference, Name = name of the entity, HasValue = false).

ResolveEntity

El método ResolveEntity se puede utilizar para expandir la entidad general para nodos EntityReference, lo que permite optimizar el tratamiento de las entidades al expandir la entidad sólo cuando es necesario. Si se llama al método GetAttribute, se expanden las entidades generales.

El tratamiento de las entidades se puede cambiar en todo momento durante el proceso de lectura. Los cambios realizados en la configuración de EntityHandling surten efecto cuando se vuelve a llamar al método Read.

En el ejemplo de código siguiente se crea un XmlValidatingReader con la entrada XML de book1.xml.

Imports System
Imports System.IO
Imports System.Xml
 
Public Class Sample
   
   Public Shared Sub Main()
      Dim reader As XmlValidatingReader = Nothing
      Dim txtreader As XmlTextReader = Nothing
      
      Try
         ' Create and load the XmlTextReader with the XML file.
         txtreader = New XmlTextReader("book1.xml")
         txtreader.WhitespaceHandling = WhitespaceHandling.None
         
         ' Create the XmlValidatingReader over the XmlTextReader.
         ' Set the reader to not expand general entities.
         reader = New XmlValidatingReader(txtreader)
         reader.ValidationType = ValidationType.None
         reader.EntityHandling = EntityHandling.ExpandCharEntities
         
         reader.MoveToContent()
         ' Move to the root element.
         reader.Read()
         ' Move to the title start tag.
         reader.Skip()
         ' Skip the title element.
         ' Read the miscellaneous start tag.  The reader is now positioned on
         ' the entity reference node.
         reader.ReadStartElement()
         
         ' Because EntityHandling is set to ExpandCharEntities, you must call 
         ' ResolveEntity to expand the entity.  The entity replacement text is 
         ' then parsed and returned as a child node.
         Console.WriteLine("Expand the entity...")
         reader.ResolveEntity()
         
         Console.WriteLine("The entity replacement text is returned as a text node.")
         reader.Read()
         Console.WriteLine("NodeType: {0} Value: {1}", reader.NodeType, reader.Value)
         
         Console.WriteLine("An EndEntity node closes the entity reference scope.")
         reader.Read()
         Console.WriteLine("NodeType: {0} Name: {1}", reader.NodeType, reader.Name)
      
      Finally
         If Not (txtreader Is Nothing) Then
            txtreader.Close()
         End If
         If Not (reader Is Nothing) Then
            reader.Close()
         End If
      End Try
   End Sub
   ' Main
End Class
' Sample
[C#]
using System;
using System.IO;
using System.Xml;

public class Sample
{
  public static void Main()
  {
     XmlValidatingReader reader = null;
     XmlTextReader txtreader = null;

     try
     {
       // Create and load the XmlTextReader with the XML file.
       txtreader = new XmlTextReader("book1.xml");
       txtreader.WhitespaceHandling = WhitespaceHandling.None;

       // Create the XmlValidatingReader over the XmlTextReader.
       // Set the reader to not expand general entities.
       reader = new XmlValidatingReader(txtreader);
       reader.ValidationType = ValidationType.None;
       reader.EntityHandling = EntityHandling.ExpandCharEntities;

       reader.MoveToContent();  
       // Move to the root element.
       reader.Read();  
       // Move to the title start tag.
       reader.Skip();  
       // Skip the title element.
      
       // Read the miscellaneous start tag.  The reader is now positioned on
       // the entity reference node.
       reader.ReadStartElement(); 

       // Because EntityHandling is set to ExpandCharEntities, you must call 
       // ResolveEntity to expand the entity.  The entity replacement text is 
       // then parsed and returned as a child node.
       
       Console.WriteLine("Expand the entity...");
       reader.ResolveEntity();  

       Console.WriteLine("The entity replacement text is returned as a text node.");
       reader.Read();  
       Console.WriteLine("NodeType: {0} Value: {1}", reader.NodeType ,reader.Value);

       Console.WriteLine("An EndEntity node closes the entity reference scope.");
       reader.Read();
       Console.WriteLine("NodeType: {0} Name: {1}", reader.NodeType,reader.Name);
     
    }
    finally
    {
       if (txtreader != null)
         txtreader.Close();
       if (reader != null)
         reader.Close();
    }
  }
}

A continuación se describe el contenido del archivo de entrada, book1.xml, que se va a validar.

<?xml version='1.0' ?>
<!DOCTYPE book [<!ENTITY h 'hardcover'>]>
<book>
  <title>Pride And Prejudice</title>
  <misc>&h;</misc>
</book>

Vea también

Validación de XML con esquemas | XmlValidatingReader.ResolveEntity (Método)