in
La comunità italiana dedicata a Sviluppatori e Architetti IT delle piattaforme Windows

Aiuto su XML - C#

Ultimo messaggio ricevuto il 27-03-2008 13.41 da devspy. 1 risposta(e).
Pagina 1 di 1 (2 elemento/i)
Ordina messaggi: Precedente Successivo
  • 14-03-2008 11.57

    • niples
    • Utente Top 500
    • Registrato il 14-03-2008
    • Messaggi 4

    Aiuto su XML - C#

    Salve a tutti, 

    vi scrivo per un aiuto su un programmino che sto realizzando.

    La classe che vi incollo sotto scansiona le directory del filesystem partendo da una cartella iniziale (StartFolder) e crea un file XML con l'albero delle cartelle fino alla profondità massima.

    Vorrei modificarla in modo da passargli anche un valore int che indica il livello delle cartelle da scansionare. Ovvero se l'int =0 lui crea il file XML con il solo nodo ROOT equivalente alla prima cartella (la StartFolder per intenderci), se l'int = 1 scende l'albero di un livello, se l'int = 2 di 2 livelli e così via.

    Ho fatto qualche prova ma non riesco ad ottenere il risultato desiderato.

    qualcuno può darmi una mano?

     

    grazie infinite 

     

    namespace ScansioneCartelle
    {
        /// <summary>
        /// Summary description for FileSystemInfoLister.
        /// </summary>
        public class FileSystemInfoListerLivello {

            XmlDocument xmlDoc;

            public FileSystemInfoListerLivello() {
                xmlDoc = new XmlDocument();
            }

            public XmlDocument GetFileSystemInfoList(string StartFolder) {

                try{
                    XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "", "yes");
                    xmlDoc.PrependChild ( xmlDec );
                    XmlElement nodeElem =  XmlElement("folder",new DirectoryInfo(StartFolder).Name);
                    xmlDoc.AppendChild(AddElements(nodeElem,StartFolder));
                }
                catch(Exception ex) {
                    xmlDoc.AppendChild(XmlElement("error",ex.Message));
                    return xmlDoc;
                }
                return xmlDoc;
            }

            private XmlElement AddElements(XmlElement startNode, string Folder){
                try{
                    DirectoryInfo dir = new DirectoryInfo(Folder);
                    DirectoryInfo[ subDirs = dir.GetDirectories() ;
                   
                    foreach (DirectoryInfo sd in subDirs) {
                        XmlElement folderElem = XmlElement("folder",sd.Name);
                        startNode.AppendChild(AddElements(folderElem,sd.FullName));
                    }
                    return startNode;
                }
                catch(Exception ex) {
                    return XmlElement("error",ex.Message);
                }
            }

            private XmlAttribute XmlAttribute(string attributeName, string attributeValue){
                XmlAttribute xmlAttrib = xmlDoc.CreateAttribute(attributeName);
                xmlAttrib.Value = FilterXMLString(attributeValue);
                return xmlAttrib;
            }

            private XmlElement XmlElement(string elementName, string elementValue){
                XmlElement xmlElement = xmlDoc.CreateElement(elementName);
                xmlElement.Attributes.Append(XmlAttribute("name", FilterXMLString(elementValue)));
                return xmlElement;
            }

            private string FilterXMLString(string inputString){
                string returnString = inputString;
                if (inputString.IndexOf("&") > 0){
                    returnString = inputString.Replace("&","&amp;");
                }
                if (inputString.IndexOf("'") > 0){
                    returnString = inputString.Replace("'","&apos;");
                }
                return returnString;
            }   
        }
    }

     

    Richiamo  GetFileSystemInfoList con questo codice e salvo il risultato in un file XML:

    string pathRisultati = arrivo + "/" + nomefile + ".xml";
    StreamWriter sw = File.CreateText(pathRisultati);
    FileSystemInfoListerLivello dl = new FileSystemInfoListerLivello();
    sw.Write(dl.GetFileSystemInfoList(partenza).InnerXml);
    sw.Close();

    • Log
  • 27-03-2008 13.41 In risposta a

    Re: Aiuto su XML - C#

    Dovresti creare una funzione ricorsiva. In pratica dovresti eseguire il tuo metodo AddElements anche per ciascuna sotto-cartella del parametro Folder di partenza. La funzione deve richiamare se stessa ogni volta che la cartella corrente contiene delle sotto-cartelle. La condizione di uscita dal ciclo è "automatica", ovvero quando le sotto-cartelle sono finite o non ci sono nella cartella corrente.

    Una volta realizzato questo meccanismo otterrai l'elenco di tutte le cartelle presenti dalla cartella principale in giù. A questo punto dei passare al primo richiamo del metodo la profondità di esecuzione della ricerca e a ciascun richiamo successivo per le sotto-cartelle il valore della profondità - 1 (meno uno). 

    • Log
Pagina 1 di 1 (2 elemento/i)
Prelevato da http://www.devspy.com/forums/p/4705/5900.aspx
DevSpy.com 6.0 © 2001-2008 - Alcuni Diritti Riservati
Salvo diversa indicazione, tutti i contenuti sono pubblicati sotto licenza "Creative Commons Attribution-Share Alike 3.0"