none
Leggere file Xml innestato piu' volte RRS feed

  • Domanda

  • Buon giorno,

    ho necessità di leggere un file strutturato come segue. Tutte le mie prove sono andare a cattivo fine. Voi cosa consigliate?

    <item value="val" sub="false">
    <item value="20" sub="false"/>
    <item value="20_002" sub="false"/>
    <item value="20_003" sub="false"/>
    <item value="PIA" sub="false">
    <item value="I" sub="false">
    <item value="A" sub="false">
    <item value="B" sub="false"/>
    <item value="B_002" sub="false"/>
    </item>
    <item value="A_002" sub="false">
    <item value="B_003" sub="false"/>
    <item value="B_004" sub="false"/>
    </item>
    <item value="A_003" sub="false">
    <item value="B_005" sub="false"/>
    <item value="B_006" sub="false"/>
    </item>
    <item value="A_004" sub="false">
    <item value="B_007" sub="false"/>
    <item value="B_008" sub="false"/>
    </item>
    <item value="A_009" sub="false"/>
    <item value="A_010" sub="false"/>
    <item value="A_011" sub="false"/>
    <item value="A_012" sub="false"/>
    <item value="A_013" sub="false"/>
    <item value="A_014" sub="false"/>
    <item value="A_015" sub="false"/>
    <item value="A_016" sub="false"/>
    <item value="A_017" sub="false"/>
    <item value="A_018" sub="false"/>
    <item value="A_019" sub="false"/>
    <item value="A_020" sub="false"/>
    </item>
    <item value="BA_019" sub="false"/>
    <item value="BA_020" sub="false"/>
    <item value="BA_021" sub="false"/>
    <item value="BA_022" sub="false"/>
    <item value="BA_023" sub="false"/>
    <item value="BA_024" sub="false"/>
    <item value="BA_025" sub="false"/>
    <item value="H" sub="false">
    <item value="A_075" sub="false"/>
    <item value="A_076" sub="false"/>
    <item value="A_077" sub="false"/>
    <item value="A_078" sub="false"/>
    </item>
    </item>
    </item>
    </item>
    </item>

    mercoledì 19 agosto 2020 13:09

Risposte

  • Ciao, io dividerei il lavoro in due fasi:

    1) ricopio il file, leggendolo come un normale file di testo e aggiungendo i rientri tipici dei file xml;

    2) adesso posso leggerlo utilizzando classi e metodi adatti ai file xml.

    Funziona. Provalo...

    using System;
    using System.Xml;
    using System.IO;
    
    namespace LeggiXml
    {
        class Program
        {
            static void Main(string[] args)
            {
                //prima ricopio il file, aggiungendo i rientri dei file xml:
                
                StreamReader fileOrigine = new StreamReader("D:\\FileOrigine.xml");
                StreamWriter fileDest = new StreamWriter("D:\\FileDest.xml");
                int rientro = 0;
                string riga;
                while ((riga = fileOrigine.ReadLine()) != null)
                {
                    if (riga.Substring(0, 2) == "</")
                    {
                        if (rientro > 0)
                        {                        
                            fileDest.WriteLine(new string(' ', --rientro) + riga);
                        }                        
                    }                    
                    else if (riga.Substring(riga.Length-2) == "/>")
                    {
                        fileDest.WriteLine(new string(' ', rientro) + riga);
                    }
                    else
                    {                    
                        fileDest.WriteLine(new string(' ', rientro++) + riga);
                    }
                }
                fileOrigine.Close();
                fileDest.Close();
    
                //poi posso leggerlo usando classi e metodi per i file xml:
                
                XmlTextReader reader = new XmlTextReader("D:\\FileDest.xml");
                bool primo = true;
                rientro = reader.Depth;
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Whitespace)
                    {
                        continue;
                    }
                    if (primo == true)
                        primo = false;
                    else
                    {
                        if (reader.Depth > rientro)
                        {
                            rientro = reader.Depth;
                            Console.Write(">\n");
                        }                        
                        else if (reader.Depth == rientro)
                        {
                            Console.Write("/>\n");
                        }
                        else if (reader.Depth < rientro)
                        {
                            Console.Write("/>\n");
                            rientro = reader.Depth;                        
                            Console.Write(new string(' ', rientro));
                            Console.Write("</" + reader.Name + ">\n");
                            primo = true;
                            continue;
                        }
                    }                
                    Console.Write(new string(' ', rientro));
                    Console.Write("<" + reader.Name);
                    for (int i=0; i< reader.AttributeCount; i++)
                    {
                        reader.MoveToNextAttribute();
                        Console.Write(" " + reader.Name + "='"+ reader.Value+"'");                    
                    }
                    
                }
                            
            }
        }    
    }

    mercoledì 26 agosto 2020 20:16

Tutte le risposte

  • Ciao, io dividerei il lavoro in due fasi:

    1) ricopio il file, leggendolo come un normale file di testo e aggiungendo i rientri tipici dei file xml;

    2) adesso posso leggerlo utilizzando classi e metodi adatti ai file xml.

    Funziona. Provalo...

    using System;
    using System.Xml;
    using System.IO;
    
    namespace LeggiXml
    {
        class Program
        {
            static void Main(string[] args)
            {
                //prima ricopio il file, aggiungendo i rientri dei file xml:
                
                StreamReader fileOrigine = new StreamReader("D:\\FileOrigine.xml");
                StreamWriter fileDest = new StreamWriter("D:\\FileDest.xml");
                int rientro = 0;
                string riga;
                while ((riga = fileOrigine.ReadLine()) != null)
                {
                    if (riga.Substring(0, 2) == "</")
                    {
                        if (rientro > 0)
                        {                        
                            fileDest.WriteLine(new string(' ', --rientro) + riga);
                        }                        
                    }                    
                    else if (riga.Substring(riga.Length-2) == "/>")
                    {
                        fileDest.WriteLine(new string(' ', rientro) + riga);
                    }
                    else
                    {                    
                        fileDest.WriteLine(new string(' ', rientro++) + riga);
                    }
                }
                fileOrigine.Close();
                fileDest.Close();
    
                //poi posso leggerlo usando classi e metodi per i file xml:
                
                XmlTextReader reader = new XmlTextReader("D:\\FileDest.xml");
                bool primo = true;
                rientro = reader.Depth;
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Whitespace)
                    {
                        continue;
                    }
                    if (primo == true)
                        primo = false;
                    else
                    {
                        if (reader.Depth > rientro)
                        {
                            rientro = reader.Depth;
                            Console.Write(">\n");
                        }                        
                        else if (reader.Depth == rientro)
                        {
                            Console.Write("/>\n");
                        }
                        else if (reader.Depth < rientro)
                        {
                            Console.Write("/>\n");
                            rientro = reader.Depth;                        
                            Console.Write(new string(' ', rientro));
                            Console.Write("</" + reader.Name + ">\n");
                            primo = true;
                            continue;
                        }
                    }                
                    Console.Write(new string(' ', rientro));
                    Console.Write("<" + reader.Name);
                    for (int i=0; i< reader.AttributeCount; i++)
                    {
                        reader.MoveToNextAttribute();
                        Console.Write(" " + reader.Name + "='"+ reader.Value+"'");                    
                    }
                    
                }
                            
            }
        }    
    }

    mercoledì 26 agosto 2020 20:16
  • L'informazione necessaria e' fornita al cliente.

    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    lunedì 31 agosto 2020 09:05
    Moderatore