In questo post riporto un paio di tips non molto frequenti ma che possono comunque tornare utili quando si elaborano istanze XML in .NET:
1. Elaborare XML Fragments
Alcune volte si ha la necessità di elaborare XML non "fully conformant", ad esempio in assenza di un unico elemento root (in questo caso si parla di "XML fragment"). Nella fattispecie, se un frammento XML di questo tipo
<elem1>...</elem1><elem2>...</elem2>
venisse impostato come source di un XmlReader o un XmlDocument, otterremmo una bella XmlException "Elementi di primo livello multipli. Riga X, Posizione Y". Un modo corretto per lavorare con XmlFragment è quello di utilizzare la classe XmlReaderSettings per impostare la proprietà ConformanceLevel sul valore ConformanceLevel.Fragment:
string xmlFragmentString = "<elem1></elem1><elem2></elem2>";
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(new StringReader(xmlFragmentString), xmlReaderSettings);
2. Eliminare le identazioni in un XmlDocument
Quando si vuole ridurre al minimo le dimensioni di un documento XML, spesso è desiderabile eliminarne gli spazi bianchi non significativi che servono per l'identazione dei vari elementi: un requisito di questo tipo può tornare utile se i dati non devono essere letti da un essere umano bensì da una applicazione. In pratica, supponendo di avere il seguente documento XML memorizzato in un file testWithWhiteSpaces.xml:
<Root>
<Elem1>...</Elem1>
<Elem2>...</Elem2>
<Elem3>
<Elem3_1>...</Elem3_1>
<Elem3_2>...</Elem3_2>
</Elem3>
</Root>
...il risultato che vorremmo ottenere è:
<Root><Elem1>...</Elem1><Elem2>...</Elem2><Elem3><Elem3_1>...</Elem3_1><Elem3_2>...</Elem3_2></Elem3></Root>
In .NET, tutto ciò è facilmente ottenibile tramite la proprietà XmlDocument.PreserveWhitespace. Differentemente da quanto si possa intuire, l'eliminazione degli spazi bianchi delle identazioni avviene correttamente se la si imposta a true.
Il seguente codice mostra quindi come 1.caricare in memoria un documento XML memorizzato su file system, 2. specificare esplicitamente la rimozione degli spazi bianchi di identazione e 3. salvare il risultato in un nuovo file.
XmlDocument xDoc = new XmlDocument();
xDoc.Load("C:/testWithWhiteSpaces.xml");
xDoc.PreserveWhitespace = true;
xDoc.Save("C:/testWithoutWhiteSpaces.xml");
E' bene notare come, in questo semplice esempio, l'istanza XML senza identazioni occupa oltre il 20% in meno rispetto a quella con identazioni.
In definitiva concludiamo affermando che l'eliminazione di spazi bianchi non significativi può costituire un' immediata e semplicissima "best practice" per aumentare le presentazioni di applicazioni che si scambiano dati XML in rete.