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