Gestione dello spazio con XmlTextReader

I caratteri spazio possono essere divisi in due categorie: significativi e non significativi. Un carattere spazio significativo è un qualsiasi spazio all'interno di un modello di contenuto misto definito dal DTD oppure uno spazio che rientra nell'area di validità dell'attributo speciale xml:space, quando questo è impostato su "preserve". Un carattere spazio significativo è un qualsiasi carattere spazio che è necessario mantenere dal documento originale al documento finale. Un carattere spazio non significativo è un carattere spazio che non è necessario mantenere dalla lettura del documento al documento di output. Un carattere spazio può essere uno qualsiasi dei seguenti caratteri:

  • Spazio (spazio ASCII, 0x20)
  • Ritorno a capo (CR, 0x0D)
  • Avanzamento riga (LF, 0x0A)
  • Tabulazione orizzontale (0X09)

Gli standard W3C impongono che i caratteri spazio vengano gestiti in modo diverso a seconda del punto del documento in cui si trovano e in base all'impostazione dell'attributo xml:space. Se tali caratteri si trovano all'interno del contenuto misto dell'elemento o all'interno dell'area di validità dell'xml:space="preserve", dovranno essere mantenuti e passati senza modifiche all'applicazione. Tutti gli altri caratteri spazio potranno essere scartati.

XmlTextReader consente di mantenere solo gli spazi che si trovano in un contesto xml:space="preserve". Poiché XmlTextReader non analizza un DTD, il reader non mantiene lo spazio definito come contenuto misto nel DTD, in quanto il reader non rileva la presenza della definizione di contenuto misto. Se si desidera mantenere lo spazio in un elemento di contenuto misto, è possibile utilizzare XmlValidatingReader, che analizza il DTD e individua gli elementi con contenuto misto.

Per visualizzare il tipo di carattere spazio presente nel nodo corrente, utilizzare la proprietà XmlReader.NodeType. I carattere spazio significativi vengono restituiti con un'enumerazione di SignificantWhitespace, mentre i caratteri spazio non significativi vengono restituiti con un'enumerazione di Whitespace. Per ulteriori informazioni sulla proprietà NodeType, vedere Proprietà XmlTextReader.NodeType ed Enumerazione XmlNodeType.

Viene utilizzata un'enumerazione per consentire alla proprietà WhitespaceHandling di determinare come vengono restituiti dal lettore i caratteri spazio. Per ulteriori informazioni sul recupero o sull'impostazione della proprietà, vedere Proprietà XmlTextReader.WhitespaceHandling. Per ulteriori informazioni sui valori dell'enumerazione, vedere Enumerazione WhitespaceHandling. Per ulteriori informazioni sugli standard W3C, vedere la Sezione 2.10 della raccomandazione Extensible Markup Language (XML) 1.0, all'indirizzo www.w3.org/XML/Group/2000/07/REC-xml-2e-review\#sec-white-spac (informazioni in lingua inglese).

Di seguito è riportato un esempio di XML contenente caratteri spazio e il cui attributo xml:space è impostato su "preserve". Il carattere newline è descritto alla fine delle righe di quest'esempio come carattere spazio speciale.

<!DOCTYPE test [

<!ELEMENT test (item | book)*> <-- element content model -->

<!ELEMENT item (item*)> <-- element content model -->

<!ATTLIST item xml:space (default | preserve) #IMPLIED>

<!ELEMENT book (#PCDATA | b | i)*> <-- mixed content model -->

<!ELEMENT b (#PCDATA)> <-- mixed content model -->

<!ELEMENT i (#PCDATA)> <-- mixed content model -->

]>

<test>

••••<item>

••••••••<item xml:space="preserve">º

ºººººººººººº<item/>º

ºººººººº</item>

••••</item>

••••<book>º

ºººººººº<b>This<b>º

ºººººººº<i>is</i>º

ºººººººº<b>a test</b>º

ºººº</book>

</test>

Il carattere spazio (•) non è significativo, mentre il carattere spazio (º) è significativo.

Nota   L'area di validità dell'attributo xml:space consente di modificare ciò che normalmente verrebbe considerato un carattere spazio non significativo, in un carattere spazio significativo.

Allo stesso modo, l'elemento book viene definito come modello di contenuto misto nel DTD, per indicare che è in grado di contenere gli elementi b o i. In un modello di contenuto misto, i caratteri spazio all'interno dell'elemento booksono considerati significativi. XmlTextReader non riconoscerà il modello di contenuto misto in quanto non utilizza le informazioni fornite nel DTD. Per ottenere nodi spazio significativi nei modelli di contenuto misto, è necessario utilizzare XmlValidatingReader .

Vedere anche

Lettura dell'XML con XmlReader | Lettura del contenuto completo utilizzando i flussi di caratteri | Informazioni sulla dichiarazione del tipo di dati | Normalizzazione del valore degli attributi | Gestione delle eccezioni utilizzando XmlException in XmlTextReader | Classe XmlReader | Membri XmlReader | Classe XmlNodeReader | Membri XmlNodeReader | Classe XmlTextReader | Membri XmlTextReader | Classe XmlValidatingReader | XmlValidatingReader