Freigeben über


Auflösen von Entitäten mit XmlValidatingReader

Die EntityHandling-Eigenschaft definiert, wie Entitäten durch XmlValidatingReader behandelt werden sollen.

ExpandEntities

Wenn die EntityHandling-Eigenschaft auf ExpandEntities gesetzt ist, erweitert XmlValidatingReader alle Entitäten im XML-Dokument. Da der Entitätstext erweitert ist, wird XmlNodeType von EntityReference nicht angezeigt. Dies ist die Standardeinstellung.

ExpandCharEntities

Wenn die EntityHandling-Eigenschaft auf ExpandCharEntities gesetzt ist, erweitert XmlValidatingReader die Zeichenentitäten und gibt die allgemeinen Entitäten als EntityReference-Knotentypen zurück (NodeType = XmlNodeType.EntityReference, Name = name of the entity, HasValue = false).

ResolveEntity

Durch die ResolveEntity-Methode kann die allgemeine Entität für EntityReference-Knoten erweitert werden. Dadurch wird die Behandlung der Entitäten optimiert, da diese nur bei Bedarf erweitert werden. Bei Aufruf der GetAttribute-Methode werden die allgemeinen Entitäten erweitert.

Die Behandlung von Entitäten kann während des Leseprozesses jederzeit geändert werden. Die Änderungen der Einstellung von EntityHandling werden beim nächsten Aufruf der Read-Methode wirksam.

Im folgenden Codebeispiel wird ein XmlValidatingReader mit der XML-Eingabe von book1.xml erstellt.

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();
    }
  }
}

Im folgenden Beispiel wird der Inhalt der zu überprüfenden Eingabedatei book1.xml dargestellt.

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

Siehe auch

Gültigkeitsprüfung von XML mit Schemas | XmlValidatingReader.ReadTypedValue-Methode