Lecture de fragments XML à l'aide de XmlValidatingReader
La classe XmlValidatingReader peut lire des fragments XML en analysant une chaîne donnée comme un fragment de code XML, ce qui vous permet de contourner les règles de niveau racine visant à obtenir des documents XML correctement construits.
La méthode XmlValidatingReader est l'équivalent, pour la validation, de XmlTextReader qui est utilisé pour construire des fragments de document. Le paramètre XmlNodeType détermine la manière dont la chaîne donnée est analysée. Le tableau ci-dessous explique la façon dont chaque type est analysé.
Type | Contenu du fragment |
---|---|
Élément | Tout contenu d'élément valide, y compris une combinaison d'éléments, de commentaires, d'instructions de traitement, de CDATA et de texte. |
Attribut | Valeur d'un attribut. |
Document | Le contenu d'un document XML entier. Ce type applique les règles de niveau racine. |
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. Passer n'importe quelle autre énumération XmlNodeType lève une exception ArgumentException.
Le constructeur XmlParserContext qui contient le sous-ensemble DTD interne et le littéral system et public est nécessaire si la propriété ValidationType a la valeur 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, le constructeur 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é à XmlSchemaCollection, soit référencé directement à l'intérieur du fragment XML. 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.
Une exception ArgumentException est levée si la propriété ValidationType a la valeur DTD et que le constructeur XmlParserContext ne contient aucune propriété DTD.
L'exemple de code ci-dessous utilise la classe XmlValidatingReader pour lire des fragments XML et les envoyer à 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
[C#]
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 XmlParserContext pour fournir l'espace de noms nécessaire à 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
[C#]
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 en entier afin de pouvoir effectuer la validation.
Voir aussi
Validation XML à l'aide de XmlValidatingReader | Validation XML à l'aide de schémas | XmlSchemaCollection comme cache de schéma | XmlParserContext, classe