Lecture de fragments XML à l'aide de XmlValidatingReader
La classe XmlValidatingReader peut lire des fragments XML en analysant une chaîne en tant que fragment de code XML.
Remarque |
---|
La classe XmlValidatingReader est obsolète dans le .NET Framework version 2.0.Vous pouvez créer une instance de l'objet XmlReader de validation à l'aide de la classe XmlReaderSettings et de la méthode Create.Pour plus d'informations, voir Validation de données XML avec XmlReader. |
Classe XmlParserContext
La classe XmlParserContext permet de construire un objet XmlValidatingReader avec les informations de contexte requises pour analyser un fragment ou document XML. La classe XmlParserContext peut fournir des informations telles que l'objet XmlNameTable à utiliser, la portée de l'espace de noms, la définition de type de document (DTD), l'encodage, ainsi que le xml:lang actuel et la portée xml:space.
Lors de la construction de l'objet XmlValidatingReader, vous devez également spécifier le type de nœud XML. Le type de nœud XML détermine si les données seront analysées comme un fragment ou comme un document XML correctement construit. Le tableau suivant répertorie le type de nœud et le type de données que l'analyseur attend. Le fait de passer une autre valeur XmlNodeType lève une exception ArgumentException.
Type |
Contenu du fragment |
---|---|
Element |
Tout contenu d'élément valide, y compris une combinaison d'éléments, de commentaires, d'instructions de traitement, de CDATA et de texte. Une déclaration XML peut également survenir comme premier nœud. Cela vous permet de spécifier l'encodage pour le fragment XML. |
Attribut |
Valeur d'un attribut. |
Document |
Le contenu d'un document XML entier. Ce type applique les règles de document XML correctement construit. |
Les références d'entités qui se trouvent dans les contenus d'élément ou d'attribut sont traitées en fonction de l'indicateur EntityHandling. Vous pouvez passer des informations DTD utilisées pour résoudre des entités et ajouter des attributs par défaut à l'aide de la classe XmlParserContext.
Le constructeur XmlParserContext contenant le littéral PUBLIC, le littéral SYSTEM et le sous-ensemble de DTD interne est requis si la propriété ValidationType est DTD ou Auto, et si la résolution d'entités et l'ajout d'attributs par défaut sont importants. Pour tous les autres types de validation, l'objet XmlParserContext sans propriétés DTD peut être fourni (notamment les schémas). Tout schéma utilisé pour valider le fragment XML doit être soit ajouté à l'objet XmlSchemaCollection, soit référencé directement à l'intérieur du fragment XML. L'objet XmlParserContext est utilisé pour fournir des informations supplémentaires (telles que la résolution des espaces de noms et des informations DTD, par exemple) qui sont nécessaires à l'analyse des fragments XML.
Un objet ArgumentException se produit si la propriété ValidationType a la valeur DTD et si l'objet XmlParserContext ne contient pas de propriétés de DTD.
Exemple
L'exemple de code suivant utilise l'objet XmlValidatingReader pour lire des fragments XML et les écrire dans la console.
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);
}
}
L'exemple de code suivant lit un fragment XML à l'aide de l'objet XmlParserContext pour fournir l'espace de noms nécessaire à partir de l'objet 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);
}
}
L'analyse de fragment n'est pas possible lorsque la propriété ValidationType a la valeur DTD car, par définition, une DTD nécessite le chargement d'un document entier afin de pouvoir effectuer la validation.