Lettura di frammenti XML con XmlValidatingReader

La classe XmlValidatingReader può leggere frammenti XML analizzando una determinata stringa come un frammento di XML, consentendo di ignorare le regole del livello principale di documenti XML corretti.

L'utilizzo di XmlValidatingReader è l'equivalente di convalida di XmlTextReader utilizzato per costruire frammenti di documenti. Il parametro XmlNodeType determina il modo in cui viene analizzata la stringa. Nella tabella che segue viene illustrata l'analisi di ogni tipo.

Tipo Il frammento contiene
Elemento Qualsiasi contenuto valido degli elementi, compresi una combinazione di elementi, commenti, istruzioni di elaborazione, CDATA e testo.
Attributo Il valore di un attributo.
Documento Contenuto di un intero documento XML. Questo tipo applica le regole di primo livello.

I riferimenti a entità trovati nel contenuto di un elemento o attributo vengono elaborati in base al flag EntityHandling. È possibile passare informazioni su DTD (document type definition) utilizzati per risolvere entità e aggiungere attributi predefiniti mediante la classe XmlParserContext. Il passaggio in qualsiasi altra enumerazione XmlNodeType genera una ArgumentException.

Il costruttore di XmlParserContext contenente il sottoinsieme del DTD pubblico, della rappresentazione formale, della rappresentazione formale di sistema e interno è obbligatorio se la proprietà ValidationType è DTD o Auto e se è importante risolvere entità e aggiungere attributi predefiniti. Per tutti gli altri tipi di convalida è possibile fornire il XmlParserContext senza proprietà DTD (ad esempio schemi). Qualsiasi schema utilizzato per convalidare il frammento XML deve essere aggiunto al XmlSchemaCollection o se ne deve fare riferimento direttamente all'interno del frammento XML. Il XmlParserContext viene utilizzato per fornire ulteriori informazioni, quali una risoluzione dello spazio dei nomi, informazioni su DTD e così via, necessarie per l'analisi di frammenti XML.

ArgumentException si verifica se la proprietà ValidationType è impostata su DTD e XmlParserContext non contiene alcuna proprietà DTD.

Nell'esempio di codice che segue viene utilizzato XmlValidatingReader per leggere frammenti XML e scriverli nella 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);
   }
}

Nell'esempio di codice che segue viene letto un frammento XML mediante XmlParserContext per fornire lo spazio dei nomi richiesto da 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'analisi dei frammenti non è possibile quando la proprietà ValidationType è impostata su DTD in quanto, per definizione, un DTD richiede che un intero documento venga caricato per eseguire la convalida.

Vedere anche

Convalida del linguaggio XML con XmlValidatingReader | Convalida del linguaggio XML con schemi | XmlSchemaCollection come cache degli schemi | Classe XmlParserContext