Results 1 to 5 of 5

Thread: van XML naar CSV

  1. #1

    van XML naar CSV

    Ik maak gebruik van onderstaande
    C# Code:
    1. static void GenerateCsvFromXml(string xmlString, string resultFileName, bool isTabDelimited)
    2.         {
    3.  
    4.             XDocument xDoc = XDocument.Parse(xmlString);    
    5.  
    6.             string delimiter = "\t";            
    7.  
    8.  
    9.             // Get title row
    10.            
    11.             var titlesList = xDoc.Root
    12.                 .Elements()
    13.                 .First()
    14.                 .Elements()
    15.                 .Select(s => s.Name.LocalName)
    16.                 .ToList();
    17.  
    18.             var masterValuesList = xDoc.Root
    19.                  .Elements()
    20.                  .Select(e => e
    21.                      .Elements()
    22.                      .Select(c => c.Value)
    23.                      .ToList())
    24.                  .ToList();
    25.  
    26.            
    27.             // Add titles as first row in master values list
    28.             masterValuesList.Insert(0, titlesList);
    29.  
    30.  
    31.            
    32.  
    33.             // Write the file
    34.             using (var fs = new FileStream(resultFileName, FileMode.Create))
    35.             using (var sw = new StreamWriter(fs))
    36.             {
    37.                 foreach (var values in masterValuesList)
    38.                 {
    39.                     string line = string.Empty;
    40.  
    41.                     foreach (var value in values)
    42.                     {
    43.                         line += value;
    44.                         if (titlesList.IndexOf(value) < titlesList.Count - 1)
    45.                         {
    46.  
    47.                            line += delimiter;
    48.                            
    49.                         }
    50.                     }
    51.  
    52.                     sw.WriteLine(line);
    53.                 }
    54.             }
    55.         }


    Dit werkt goed bij een XML bestand waarvan de records gelijk zijn. Nu heb ik alleen een XML als volgt :

    Code:
    <ArrayOfDealer xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <Dealer>
            <DealerNumber/>
            <DealershipName>BROWARD MOTORSPORTS - WPB</DealershipName>
        </Dealer>
        <Dealer>
            <Cmf>76071027</Cmf>
            <DealerNumber/>
            <DealershipName>BROWARD MOTORSPORTS OF FT LAUDERDALE LLC</DealershipName>
        </Dealer>
        <Dealer>
            <Cmf>76014750</Cmf>
            <DealerNumber/>
            <DealershipName>Jet Ski of Miami</DealershipName>
        </Dealer>
        <Dealer>
            <Cmf>76066987</Cmf>
            <DealershipName>BROWARD MOTORSPORTS - Davie</DealershipName>
        </Dealer>
    </ArrayOfDealer>
    Doordat in het XML bestand niet ieder record gelijk is , krijg ik
    Code:
    76066699,BROWARD,MOTORSPORTS - WPB,
    76071027,MOTORSPORTS OF FT LAUDERDALE LLC,
    76066987,BROWARD,MOTORSPORTS - Davie,
    i.p.v.

    Code:
    76066699,BROWARD,MOTORSPORTS - WPB,
    76071027,,MOTORSPORTS OF FT LAUDERDALE LLC,
    76066987,BROWARD,MOTORSPORTS - Davie,
    Weet iemand hoe ik masterValuesList kan aanpassen zodat deze altijd de zelfde aantal velden als titlesLis krijgt?

    Gr,
    Fonzie

  2. #2
    Je loopt nu de values af en wat er niet is wordt daardoor overgeslagen. Ik zou een array van fieldNames maken, die aflopen en dan de waarde opvragen. Als er dan geen waarde is krijg je automatisch een lege "kolom".
    Marcel

  3. #3
    Het probleem met eerst een array met fieldnames maken kan zijn dat je eerst de hele xml door moet. In de laatste node kan n.l. een veld staan dat daarvoor nog niet gebruikt is. Dit zou bij hele grote bestanden een probleem kunnen zijn.

    In dat geval kan het makkelijker/efficienter zijn om te werken met een tussen-formaat. Een database b.v. Dat kan een TClientdataset zijn (in geheugen) of een externe db naar keuze. Je kunt dan direct de nodes vullen in een record. Kom je een nog niet gebruikte veldnaam tegen dan kun je die eerst toevoegen. Als laatste kun je de dataset naar csv schrijven.

    Dit zal waarschijnlijk alleen efficiënt zijn bij grote xml maar nog wel klein genoeg om de dataset in het geheugen te houden. Anders heb je toch weer de tweede keer lezen van een externe db.

  4. #4
    Dat zou kloppen als de maker van de XML zelf mag bepalen wat er in komt te staan. Als je communiceert met XML leg je in een schema (XSD) het formaat vast. Aan de hand van het schema weet je welke velden en welke types je waar kunt verwachten.

    Als je wel met XML werkt, maar zonder schema biedt XML geen voordelen ten opzichte van gewone tekstbestanden.
    Marcel

  5. #5
    Beide bedankt voor het meedenken en sorry dat ik nog niet heb gereageerd.
    Het eerste record van de XML bevat alle Veldnamen dus deze is zonder ontbrekende velden deze kan ik dus gebruiken om te kijken uit hoeveel velden het record bestaat.

    In iedergeval bedankt voor het sturen in de goede richting, zodra ik er weer aan mag zal ik hier posten wat mijn uiteindelijke code is geworden..

    Gr,
    Fonzie

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •