Résolution des entités à l'aide de XmlValidatingReader
La propriété EntityHandling définit la manière dont XmlValidatingReader gère les entités.
ExpandEntities
Si la propriété EntityHandling a la valeur ExpandEntities, XmlValidatingReader développe toutes les entités dans le document XML. Étant donné que le texte de l'entité est développé, XmlNodeType de EntityReference n'apparaît pas. Il s'agit de la valeur par défaut.
ExpandCharEntities
Si la propriété EntityHandling a la valeur ExpandCharEntities, XmlValidatingReader développe les entités de caractères et retourne les entités générales en tant que types de nœud EntityReference (NodeType = XmlNodeType.EntityReference, Name = name of the entity, HasValue = false
).
ResolveEntity
La méthode ResolveEntity peut être utilisée pour développer l'entité générale des nœuds EntityReference, ce qui vous permet d'optimiser la gestion des entités en développant l'entité uniquement lorsque cela est nécessaire. Si la méthode GetAttribute est appelée, les entités générales sont développées.
La gestion des entités peut être modifiée à tout moment lors du processus de lecture. Les modifications apportées au paramètre EntityHandling prennent effet lors de l'appel subséquent de la méthode Read.
L'exemple de code ci-dessous crée une classe XmlValidatingReader à partir du contenu XML du fichier d'entrée, 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();
}
}
}
Le code ci-dessous présente le contenu du fichier d'entrée, book1.xml, à valider.
<?xml version='1.0' ?>
<!DOCTYPE book [<!ENTITY h 'hardcover'>]>
<book>
<title>Pride And Prejudice</title>
<misc>&h;</misc>
</book>
Voir aussi
Validation XML à l'aide de schémas | XmlValidatingReader.ResolveEntity, méthode