none
Werte von Datatable in eine xml Datei kopieren RRS feed

  • Frage

  • Hallo liebes Forum,

    ich arbeite an einem kleinen Programm mit dem man eine bestehende xml datei editieren kann. Vieles funktioniert schon und im moment überlege ich wie ich die Werte aus meinem Datenblatt in meine xml datei kopieren kann. Ich hab auch schon verschiedenes probiert, leider ohne Erfolg deswegen hoffe ich dass ihr mir den entscheidenden tipp geben könnt und mir sagen was ich falsch mache. Ich verwende folgenden Code um meine Datei (csv) einzulesen:

    private void CTable()
    {
        Datatable dt = new Datatable();
        using (Streamreader sr = new Streamreader(@Pfadangabe))
        {
            string [] head = sr.ReadLine().Split(";");
            foreach (string head in headers)
            {
                dt.Columns.Add(head);
            }
            while (!sr.EndOfStream)
            {
                string[] rows = sr.ReadLine().Split(";");
                DataRow dr = dt.NewRow();
                for (int i = 0; i < headers.Length; i++)
                {
                    dr[i] = rows[i];
                }
                foreach (DataRow drs in dt.Rows)
                {
                    foreach (DataColumn col in dt.Columns)
                    {
                        drs[col] = drs.[col].ToString().Replace("kg","");
                    }
                    drs[col] = drs[col].ToString().Trim();
                }
            }}
    
    private void Grid_Loaded(object sender, RoutedEventArgs e)
    {
        this.CTable();
    }

    Ich habe im xaml ein Datagrid erstellt und zeige den Inhalt der csv Datei dort an. Das Grid ist nicht unbedingt notwendig, ich habe auch schon überlegt ob ich eine Listbox verwenden soll gibt mehrere Möglichkeiten. Mich interessieren auch nur die Zahlen die in Spalte 3 stehen. Als Beispiel: Die Zahl die in Zeile 1 Spalte 3 steht soll in meine xml datei kopiert werden, bspw. nach 

    int number = row.Field<int>("Number");

    dt.Rows[1].Field<int>(3); childNode["Weight[1]"].InnerText  = number;

    Rows[1] kann ich durch Rows[i] ersetzen und eine foreach Schleife machen ... is nicht so schwer.

    Die xml datei wird mit xmlDocument gelesen, der Name des Knotens der datei ist Weight, die Pfadangabe und wie ich die datei einlese ist richtig, das klappt. Aber wie kann ich es schaffen die Werte der csv Datei dorthin zu kopieren? Der Code oben erscheint mir als Lösungsansatz nicht komplett falsch aber irgendwas scheint zu fehlen. Ich würde mich über einen tipp sehr freuen. Gruß


    • Bearbeitet Nobby092 Montag, 18. März 2019 18:19
    Montag, 18. März 2019 18:14

Antworten

  • Hi,
    wenn Du sowieso eine XML-Datei ausgeben willst, dann lies die Daten aus der CSV-Datei gleich in ein XElement ein.

        XElement xe0 = new XElement("Root");
        using (Streamreader sr = new Streamreader(@Pfadangabe))
        {
            string [] head = sr.ReadLine().Split(";");
            while (!sr.EndOfStream)
            {
                string[] cols = sr.ReadLine().Split(";");
    	    XElement xe1 = new XElement("Weight");
                for (int i = 0; i < headers.Length; i++)
                {
                    XElement xe2 = new XElement(head[i])
    		xe2.Value = cols[i].Replace("kg","");
    	        xe1.Add(xe2;
                }
    	    xe0.Add(xe1);
            }
        } 

    Das XElement (xe0) kannst Du einfach mit Save als XML-Datei ausgeben. Für die Anzeige kannst Du XPath oder LinQ to XML zur Bereitstellung der Daten für die Anzeige nutzen.

    Alternativ ist auch eine Liste von Datenobjekten denkbar. Für die Datenobjekte deklarierst Du eine Klasse mit den Eigenschaften entsprechend den Spalten. Jede eingelesene Zeile wird genau so mit Split zerlegt; für jede Zeile wird ein neues Datenobjekt instanziiert; die Datenobjekte werden einer typisierten Liste hinzugefügt. Mit einer Serializer kann dann diese Liste als XML-Datei eigegeben werden. 

        List<Data> l = new List<Data>();
        using (Streamreader sr = new Streamreader(@Pfadangabe))
        {
            string [] head = sr.ReadLine().Split(";");
            while (!sr.EndOfStream)
            {
                Data d = new Data();
    	    string[] cols = sr.ReadLine().Split(";");
    	    d.Feld1 = cols[0];
    	    d.Feld2 = cols[1];
    	    d.Feld3 = cols[2].Replace("kg","");
    	    l.Add(d);
            }
        }
    
    public class Data
    {
        public string Feld1 {get; set;}
        public string Feld2 {get; set;}
        public string Feld3 {get; set;}
    } 


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Montag, 18. März 2019 19:09
  • Danke, den ersten Vorschlag finde ich gut, Solved


    • Bearbeitet Nobby092 Dienstag, 19. März 2019 11:38
    • Als Antwort markiert Nobby092 Dienstag, 19. März 2019 16:12
    Dienstag, 19. März 2019 07:55

Alle Antworten

  • Hi,
    wenn Du sowieso eine XML-Datei ausgeben willst, dann lies die Daten aus der CSV-Datei gleich in ein XElement ein.

        XElement xe0 = new XElement("Root");
        using (Streamreader sr = new Streamreader(@Pfadangabe))
        {
            string [] head = sr.ReadLine().Split(";");
            while (!sr.EndOfStream)
            {
                string[] cols = sr.ReadLine().Split(";");
    	    XElement xe1 = new XElement("Weight");
                for (int i = 0; i < headers.Length; i++)
                {
                    XElement xe2 = new XElement(head[i])
    		xe2.Value = cols[i].Replace("kg","");
    	        xe1.Add(xe2;
                }
    	    xe0.Add(xe1);
            }
        } 

    Das XElement (xe0) kannst Du einfach mit Save als XML-Datei ausgeben. Für die Anzeige kannst Du XPath oder LinQ to XML zur Bereitstellung der Daten für die Anzeige nutzen.

    Alternativ ist auch eine Liste von Datenobjekten denkbar. Für die Datenobjekte deklarierst Du eine Klasse mit den Eigenschaften entsprechend den Spalten. Jede eingelesene Zeile wird genau so mit Split zerlegt; für jede Zeile wird ein neues Datenobjekt instanziiert; die Datenobjekte werden einer typisierten Liste hinzugefügt. Mit einer Serializer kann dann diese Liste als XML-Datei eigegeben werden. 

        List<Data> l = new List<Data>();
        using (Streamreader sr = new Streamreader(@Pfadangabe))
        {
            string [] head = sr.ReadLine().Split(";");
            while (!sr.EndOfStream)
            {
                Data d = new Data();
    	    string[] cols = sr.ReadLine().Split(";");
    	    d.Feld1 = cols[0];
    	    d.Feld2 = cols[1];
    	    d.Feld3 = cols[2].Replace("kg","");
    	    l.Add(d);
            }
        }
    
    public class Data
    {
        public string Feld1 {get; set;}
        public string Feld2 {get; set;}
        public string Feld3 {get; set;}
    } 


    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Montag, 18. März 2019 19:09
  • Danke, den ersten Vorschlag finde ich gut, Solved


    • Bearbeitet Nobby092 Dienstag, 19. März 2019 11:38
    • Als Antwort markiert Nobby092 Dienstag, 19. März 2019 16:12
    Dienstag, 19. März 2019 07:55
  • Hallo Nobby092,

    Als Antwort markiert Nobby092  Dienstag, 19. März 2019 16:12

    Ich möchte Dich daran erinnern, dass es sinnvoll und für künftige Leser dieses Threads hilfreich wäre, wenn Du den aufschlussreichen Beitrag mit der richtigen Lösung (und nicht das Dankeswort) als Antwort markieren würdest.

    Die Lösung wird durch das Markieren hervorgehoben und somit übersichtlicher. Den eigenen Beitrag zu markieren ergibt nur dann Sinn, wenn Du selbst zur Lösung gekommen bist und sie nicht schon im Thread geschildert wurde. Ich verweise Dich auf die Forenregeln:

    ·        Lösungsbeiträge als “Die Antwort“ markieren
    Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
    [Quelle: Forenregeln]

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 22. März 2019 07:24
    Moderator