Lettura dell'XML con XmlReader

La classe XmlReader è una classe astratta di base con la quale viene fornito un accesso non memorizzato nella cache, di tipo forward-only, di sola lettura. Nella classe XmlReader viene verificato che l'XML sia in formato corretto e vengono generate XmlExceptions in presenza di un errore. Con questa classe è possibile leggere un flusso o un documento e implementare i requisiti dello spazio dei nomi indicati dal W3C all'indirizzo www.w3.org/TR/REC-xml-names.

Essendo una classe astratta di base, consente di personalizzare il tipo di reader e di estendere le implementazioni correnti delle classi XmlTextReader, XmlValidatingReader e XmlNodeReader. I vincoli di protezione implementati in .NET Framework versione 1.1 per XmlReader limitano tuttavia la possibilità di ereditare XmlTextReader e XmlValidatingReader. In .NET Framework versione 1.0 tutti i componenti possono ereditare da XmlTextReader o XmlValidatingReader. Implementando una richiesta di eredetarietà nel costruttore di XmlTextReader e XmlValidatingReader in .NET Framework versione 1.1, i componenti attendibili sono ora gli unici componenti che possono ereditare da XmlTextReader o XmlValidatingReader.

La classe XmlReader consente di definire i metodi per l'estrazione di dati dall'XML o di ignorare i record non desiderati. XmlReader si differenzia dal modello SAX, che è un modello push dove il parser spinge gli eventi nell'applicazione. Per ulteriori informazioni su un confronto con il SAX, vedere Confronto di XmlReader con il modello SAX.

La classe XmlReader è dotata di metodi per:

  • Leggere il contenuto XML quando il contenuto è disponibile nella sua totalità, ad esempio un file di testo XML.
  • Trovare la profondità dello stack di elementi XML.
  • Determinare se un elemento ha un contenuto o è vuoto.
  • Leggere ed esplorare gli attributi.
  • Saltare gli elementi e il loro contenuto.

La classe XmlReader è dotata di proprietà che restituiscono informazioni, come ad esempio:

  • Il tipo e il nome del nodo corrente.
  • Il contenuto del nodo corrente.

Le implementazioni della classe XmlReader consentono di estendere la classe di base e variano nella progettazione per soddisfare le esigenze imposte dai diversi scenari. Nella tabella seguente vengono descritte le implementazioni della classe XmlReader.

Classe Descrizione
Classe XmlTextReader Consente di leggere i flussi di caratteri. Si tratta di un reader di tipo forward-only che possiede metodi che restituiscono dati sul contenuto e sui tipi di nodo. Non esiste una definizione DTD, né supporto di schemi.
Classe XmlNodeReader Fornisce un parser su un'API del modello a oggetti dei documenti XML, come la struttura XmlNode. Accetta come input un XmlNode, restituisce gli eventuali nodi presenti nella struttura DOM, compresi i nodi di riferimento alle entità. Non contiene supporto al DTD o alla convalida degli schemi, ma è in grado di risolvere le entità definite in DTD.
Classe XmlValidatingReader Fornisce un parser XML pienamente compatibile per la convalida o non convalida con il DTD, un linguaggio di definizione dello Schema XML (XSD) o il supporto per lo schema XML-Data Reduced (XDR). Accetta come input un XmlTextReader e dispone i servizi di convalida nei livelli superiori.
Creazione di un reader XML personalizzato Consente le derivazioni definite dallo sviluppatore di XmlReader.

Nota   XmlTextReader e XmlValidatingReader includono dei vincoli sulle dimensioni dei file letti. Non possono infatti leggere file superiori ai 2 GB. Se possibile, suddividere il file di origine in file più piccoli.

XsltReader è un'altra implementazione che non possiede un costruttore pubblico. Viene creata come risultato della chiamata al metodo Transform sulla classe XslTransform. Con XsltReader sono fornite le seguenti funzionalità:

  • Applica le regole che determinano che l'XML debba essere in formato corretto.
  • Non esegue la convalida in base a DTD o schemi.
  • Non espande gli attributi predefiniti, in quanto le informazioni DTD (nodi DOCTYPE) non sono esposte al modello dati XPath. Vedere la proprietà XmlReader.IsDefault. Se è necessario espandere gli attributi predefiniti nel documento di origine prima di applicare una trasformazione, l'archivio dati (ad esempio XmlDocument) dovrà essere caricato attraverso un XmlValidatingReader.

Ognuna delle classi, XmlTextReader, XmlValidatingReader e XmlNodeReader, sono progettate per supportare scenari diversi. Nella tabella riportata di seguito è indicato quale reader utilizzare per ogni scenario e quale valore assegnare alla proprietà ValidationType.

Scenario Reader da utilizzare Proprietà ValidationType
Sono necessarie prestazioni superiori ma nessun DTD o supporto dello schema. XmlTextReader Non disponibile.
È necessario che l'XML, comprese le entità esterne e i DocTypes provvisti di DTD,sia in formato corretto. XmlTextReader Non disponibile.
È necessario che l'XML sia valido e in formato corretto in base al DTD. XmlValidatingReader Auto o DTD.
È necessario che l'XML sia in formato corretto e convalidato in base a uno schema. XmlValidatingReader Auto quando non è disponibile un DTD o uno schema XDR.
È necessario che l'XML sia in formato corretto quando vi è un flusso di dati XML da un XmlNode. XmlNodeReader Non disponibile.

Nella tabella seguente viene descritto come impostare le proprietà XmlResolver e XmlTextReader.Normalization dei vari reader per ottenere ciascuno scenario.

Se si imposta la proprietà Normalization su true, i caratteri di fine riga vengono normalizzati in nodi di testo e spazi vuoti e i valori degli attributi vengono normalizzati in base al tipo. Di conseguenza, impostando la proprietà Normalization su True si ottengono prestazioni più lente di quando viene impostata su False, che è il valore predefinito. Per ulteriori informazioni, vedere Proprietà XmlTextReader.Normalization.

La proprietà XmlResolver viene utilizzata per risolvere risorse esterne definite da un Uri, ad esempio un DTD esterno o l'individuazione di uno schema. Per ulteriori informazioni sull'utilizzo della proprietà XmlResolver con reader diversi, vedere Risoluzione delle risorse mediante XmlResolver.

Scenario XmlResolver Proprietà Normalization
Sono necessarie prestazioni superiori ma nessun DTD o supporto dello schema. Impostare su un riferimento null. Per ulteriori informazioni, vedere Proprietà XmlTextReader.XmlResolver. Impostare su False.
È necessario che il documento, comprese le entità esterne e i DocTypes forniti di DTD, sia in formato corretto. Impostare su un riferimento non null. È necessario che tutte le entità esterne siano risolvibili. Per ulteriori informazioni, vedere Proprietà XmlTextReader.XmlResolver. Impostare su True.
È necessario che il documento sia in formato corretto e che l'XML sia valido in base al DTD. Impostare su un riferimento non null. È necessario che tutte le entità esterne siano risolvibili. Per ulteriori informazioni, vedere Proprietà XmlValidatingReader.XmlResolver. Impostare su True in XmlTextReader prima che venga passata a XmlValidatingReader.
È necessario che il documento sia in formato corretto e occorre la convalida in base a uno schema. Impostare su un riferimento non null. È necessario che tutte le entità esterne siano risolvibili. Per ulteriori informazioni, vedere Proprietà XmlValidatingReader.XmlResolver. Impostare su True in XmlTextReader prima che venga passata a XmlValidatingReader.
È necessario che il documento sia in formato corretto quando vi è un flusso di dati XML da un XmlNode. Non disponibile. Non disponibile.

XmlValidatingReader fornisce servizi di convalida su un XmlTextReader. Per ulteriori informazioni, vedere Convalida dell'XML con XmlValidatingReader.

Vedere anche

Posizione corrente dei nodi in XmlReader | Impostazioni delle proprietà su XmlReader | Confronto di oggetti utilizzando XmlNameTable con XmlReader | Lettura degli attributi con XmlReader | Lettura del contenuto di elementi e attributi | Omissione del contenuto con XmlReader | Lettura ed espansione con EntityReference | Confronto di XmlReader con il lettore SAX | Lettura dei dati XML con XmlTextReader | Lettura delle strutture dei nodi con XmlNodeReader | Convalida dell'XML con XmlValidatingReader | Creazione di un reader XML personalizzato | Classe XmlReader | Membri XmlReader | Classe XmlNodeReader | Membri XmlNodeReader | Classe XmlTextReader | Membri XmlTextReader | Classe XmlValidatingReader | Membri XmlValidatingReader