Aiuto su XML - C#

lunedì 17 marzo 2008 - 11.26

niples Profilo | Newbie

salve a tutti,

mi servirebbe una procedura che avendo in pasto un file .XML (o un XMLDocument) mi "tronchi" i nodi fino ad un certo livello.

Ad esempio se ho un file XML così e volessi troncarlo a livello 2:

<folder name="uno"> (LIVELLO 1)
<folder name="a"> (LIVELLO 2)
<folder name="Nuova cartella" /> (LIVELLO 3)
<folder name="Nuova cartella (2)" />
</folder>
<folder name="b">
<folder name="Nuova cartella" />
<folder name="Nuova cartella (2)" />
</folder>
</folder>

il risultato dovrà essere:

<folder name="uno"> (LIVELLO 1)
<folder name="a"> (LIVELLO 2)
</folder>
<folder name="b">
</folder>
</folder>

quindi troncando tutto quello che c'è sotto al livello 2.

qualcuno può darmi una mano?

grazie infinite
Nicola

aiedail92 Profilo | Expert

Ciao

Una soluzione potrebbe consistere in una funzione ricorsiva. Ti scrivo il codice della funzione, è tutto commentato, ma se qualcosa non si capisce, prova a chiedere spiegazioni.

/// <summary> /// Questa funzione ricorsiva elimina tutti i sottonodi /// di un nodo che si trovano ad un livello specificato sotto di esso /// </summary> /// <param name="parent">Il nodo da cui rimuovere i sottonodi</param> /// <param name="level">Il livello (in base 0) da cui troncare i sottonodi</param> /// <param name="curLevel">Questo parametro viene utilizzato dalla funzione /// ricorsiva per memorizzare il livello della gerarchia al quale è giunta. /// Quando la chiami passa 0.</param> private void DeleteSubNodes(XmlNode parent, int level, int curLevel) { //Se il livello è minore del livello al quale troncare if (curLevel < level) { //Richiamo la funzione in modo ricorsivo per tutti i sottonodi foreach (XmlNode subNode in parent.ChildNodes) { //Naturalmente il livello della gerarchia aumenta di 1 //(curLevel + 1) DeleteSubNodes(subNode, level, curLevel + 1); } } //Se invece il livello è uguale a quello indicato else if (curLevel == level) { //Elimino tutti i sottonodi while (parent.HasChildNodes) { parent.RemoveChild(parent.ChildNodes[0]); } } }

Se passare 0 come terzo argomento ti risulta scomodo, puoi creare una funzione di supporto:

private void DeleteSubNodes(XmlNode parent, int level) { DeleteSubNodes(parent, level, 0); }

E stessa cosa per lavorare con un XmlDocument invece che coi singoli nodi:

private void DeleteSubNodes(XmlDocument document, int level) { //Chiama la funzione per ciascuno dei sottonodi foreach (XmlNode childNode in document.ChildNodes) { DeleteSubNodes(childNode, level); } }

Ti ricordo infine solo che il livello da cui troncare va specificato in base 0, quindi il tuo esempio va inteso così:

<folder name="uno"> (LIVELLO 0) <folder name="a"> (LIVELLO 1) <folder name="Nuova cartella" /> (LIVELLO 2) <folder name="Nuova cartella (2)" /> </folder> <folder name="b"> (LIVELLO 1) <folder name="Nuova cartella" /> (LIVELLO 2) <folder name="Nuova cartella (2)" /> </folder> </folder>

e devi tagliare al livello 1

Luca

niples Profilo | Newbie

Ciao,

innanzi tutto grazie per il tempo dedicatomi.

Funziona alla perfezione.

sei un grande.

saluti
Nicola

aiedail92 Profilo | Expert

Di niente

e benvenuto nel forum!

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5