Vediamo nel dettaglio altri aspetti del DOM del .NET Framework che ci permettono di lavorare sui nodi di un documento XML. La classe XmlDocument espone una serie di metodi riconoscibili dal prefisso Create, che consentono di creare nuovi attributi (CreateAttribute), commenti (CreateComment), elementi (CreateElement), nodi (CreateNode) e quant'altro.
XmlNodeList listNodes = _doc.GetElementsByTagName("book");
XmlNode nodoTrovato = listNodes[0];
XmlAttribute newAttribute = _doc.CreateAttribute("id");
newAttribute.InnerText = "1";
nodoTrovato.Attributes.Append(newAttribute);
Il codice qui sopra recupera tutti gli XmlNode chiamati book e prende il primo. Poi crea un nuovo attributo - notare che il costruttore di XmlAttribute prende il nome dell'attributo stesso - gli assegna un valore importantissimo, "1" ;-), e lo aggiunge al nodo di cui abbiamo ottenuto il riferimento prima. Se salvassimo su file con il metodo Save vedremmo:
<book id="1">
<author>Terry Brooks</author>
<title>La Spada di Shannara</title>
<pages>450</pages>
<year>1998</year>
</book>
Possiamo clonare un XmlNode con la chiamata al metodo CloneNode. Per esempio, sempre tenendo presente le righe di codice scritte sopra, possiamo clonare l'oggetto nodoTrovato ed ottenere nodoClonato. Questo metodo accetta un parametro bool che esprime se la clonazione deve avvenire anche per tutti gli eventuali child nodes dell'XmlNode che stiamo clonando. Possiamo quindi indicare true o false a seconda di quello che ci serve. Il metodo ritorna un altro oggetto XmlNode che va inserito nell'XmlDocument dove ci serve. Per esempio:
// Aggiunge nodoClonato in fondo, dopo tutti i <book>
_doc.ChildNodes[0].AppendChild(nodoClonato);
// Aggiunge nodoClonato prima di tutti i <book>
_doc.FirstChild.PrependChild(nodoClonato);
AppendChild e PrependChild (di cui parlava mio fratello nel mio ultimo post) sono due metodi che inseriscono XmlNode in ultima ed in prima posizione rispetto ai child nodes dell'XmlNode su cui stiamo effettuando l'operazione.