Autor Beitrag
Bl!tz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 13:19 
Hallo,

wie der Titel schon sagt möchte ich von einem datagridview-objekt bzw. dessen datasource eine XML erstellen. ich habe im moment folgenden Code:

Hiermit lese ich eine bereits bestehende XML-Datei aus und zeige sie im datagridview an.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
public void GetTable(string XMLPath)
        {
            DataTable table = new DataTable("XMLData");

            table.Columns.Add("Profession", typeof(string));
            table.Columns.Add("Rate", typeof(string));

            XDocument data = XDocument.Load(XMLPath);
            IEnumerable<XElement> type = data.Descendants("workerType");

            var profession = type
                                .Select(x => new type()
                                                {
                                                    Profession = x.Element("name").Value,
                                                    Rate = x.Element("rate").Value
                                                });

            dataGridView1.AutoSize = true;
            dataGridView1.Visible = true;
            dataGridView1.DataSource = profession.ToList();
            
        }



hier noch die type-Klasse:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public class type
    {
        private object p;

        public string Profession { get; set; }
        public string Rate { get; set; }

        public type() 
        { }

        public type(object p)
        {
            // TODO: Complete member initialization
            this.p = p;
        }
    }


jetzt möchte ich die aktuellen Daten (um Änderungen im DGV zu berücksichtigen) die sich im DGV befinden nehmen und in eine XML, vorzugsweise im gleichen Format wie die zuvor ausgelesene XML-Datei, schreiben.

meine ersten versuche sehen so aus

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
private void btnSetRate_Click(object sender, EventArgs e)
        {
            type type1 = new type(dataGridView1.DataSource);

            XmlSerializer ser = new XmlSerializer(typeof(type));
            FileStream str = new FileStream(@Application.StartupPath + "\\Test.xml", FileMode.Create);
            
            ser.Serialize(str, type1);               //Hier werden mir in type1 alle Daten angezeigt wie ich sie haben möchte, aber ich weiß nicht wie ich diese
            str.Close();                             //Daten jetzt in eine XML-Datei schreiben kann.


        }


und hier noch ein Ausschnitt aus der vorhandenen XML-Datei:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<?xml version="1.0"?>
<ArrayOfWorkerType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <workerType>
    <name>Type 1</name>
    <rate>30</rate>
  </workerType>
  <workerType>
    <name>Type 2</name>
    <rate>31</rate>
  </workerType>
</ArrayOfWorkerType>


wie bekomme ich jetzt diese Daten aus dem datagridview vernünftig in eine XML die ich auch nachher wieder auslesen kann?

mfg

Blitz
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 27.09.12 13:46 
Hallo Bl!tz,

du hast irgendwie einen Mischmasch in deinem Code (DataTable, XDocument, XmlSerializer)...

Das einfachste wäre die Verwendung nur vom XmlSerializer, s. Mit XmlSerializer Objekte als XML speichern und laden
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 14:00 
Vegiss das DataGridView an dieser Stelle und merk dir einfach die dem Grid zugewiesene Liste. Die Liste kannst du dann mit einem beliebigen Serialisierer wegschreiben.

Zitat:
ausblenden C#-Quelltext
1:
type type1 = new type(dataGridView1.DataSource);					


An DataSource hängt eine Liste von type Objecten nicht ein type Object. type ist übrigens ein selten dä...er Name. Verwechselbar mit den eingebauten Type Typ und absolut generisch und damit völlig nutzlos. Denk dir was besseres aus.

Wen du eine bereits ein XML (und hoffentlich XSD) hast kannst du dir auch eine passende Klasse über die im Framework enthaltene xsd.exe erzeugen lassen. Im schlimsten Fall aus dem xml eine xsd erzeugen und aus dem xsd eine Klasse. Oder willst du explizit das xml Format ändern?
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 14:51 
nein ich will nicht gezwungenermaßen das XML-Format.

ich hab mir jetzt mit der xsd.exe eine xsd erstellen lassen die so aussieht, aber keine der Daten enthält die ich in der XML hatte(z.B. die aufschlüsselung der einzelnen types mit den zugehörigen rates):

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ArrayOfWorkerType" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="ArrayOfWorkerType" msdata:IsDataSet="true" msdata:Locale="en-US">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="workerType">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" minOccurs="0" />
              <xs:element name="rate" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>


und die daraus erstellte Klasse:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:4.0.30319.544
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// Dieser Quellcode wurde automatisch generiert von xsd, Version=4.0.30319.1.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class ArrayOfWorkerType {
    
    private ArrayOfWorkerTypeWorkerType[] itemsField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("workerType", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public ArrayOfWorkerTypeWorkerType[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class ArrayOfWorkerTypeWorkerType {
    
    private string nameField;
    
    private string rateField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string rate {
        get {
            return this.rateField;
        }
        set {
            this.rateField = value;
        }
    }
}


und wie bring ich das ganze jetzt zusammen?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 14:54 
Jetzt kannst du deine Daten per XmlSerializer in die ArrayOfWorkerType Klasse laden in der Klasse verändern und per XmlSerializer wieder speichern.
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 15:05 
ich hab das Deserialisieren jetzt mal so versucht:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public void GetData(string XMLPath)
        {
            ArrayOfWorkerType test;

            XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType));
            test = (ArrayOfWorkerType)xs.Deserialize(new StreamReader("GHworkerType.xsd"));
            dataGridView1.DataSource = test;
        }


da kommt aber ne Exception:

Fehler im XML-Dokument (2,2).


Zuletzt bearbeitet von Bl!tz am Do 27.09.12 15:15, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 15:14 
type hat nichts mit ArrayOfWorkerType zu tun. Kannst also garantiert nicht das eine ins andere casten.
Vergiss vorläufig type und verwende ArrayOfWorkerType.

Also

ausblenden C#-Quelltext
1:
XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType));					


und nicht type.

Und binden solltest du dann test.Items und nicht einfach test. Wenn du dir die generierte Klasse ansiehst sollte auffallen das ArrayOfWorkerType selbst keine Liste ist sondern die einzelnen Elemente in der Items Property stecken.
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 15:19 
ja das hab ich übersehen.

aber die Exception tritt ja trotzdem auf in dieser Zeile:


ausblenden C#-Quelltext
1:
test = (ArrayOfWorkerType)xs.Deserialize(new StreamReader("GHworkerType.xsd"));					


also ist wohl ein Fehler in der XSD. oder?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 15:28 
Wenn du ArrayOfWorkerType auch in den XmlSerializer geworfen hast und nicht wie in deinem Codeauszug type dann sollte das funktionieren.


Fehler im xml Dokument hört sich eher nach einem prinzipiell nicht validen XML an oder fehlerhaftem Dateiencoding (also z.B. die Datei ist nicht in utf-8 gespeichert sondern in irgendwas anderem). Unabhängig davon das die xsd.exe trotzdem dafür eine xsd und Klasse erstellen konnte.
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 15:43 
also ist meine ursprüngliche XML schon fehlerhaft?

hier ist die komplette XML:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
<?xml version="1.0"?>
<ArrayOfWorkerType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <workerType>
    <name>type1</name>
    <rate>75</rate>
  </workerType>
  <workerType>
    <name>type2</name>
    <rate>83</rate>
  </workerType>
  <workerType>
    <name>type3</name>
    <rate>105</rate>
  </workerType>
  <workerType>
    <name>type4</name>
    <rate>115</rate>
  </workerType>
  <workerType>
    <name>Others</name>
    <rate>0</rate>
  </workerType>
</ArrayOfWorkerType>


woran sehe ich jetzt das es nicht UTF-8 ist?

sorry für die blöden fragen aber ich muss das bis morgen zum laufen bringen :-)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 27.09.12 15:58 
Du mußt ja auch die XML-Datei deserialisieren und nicht die XSD-Datei:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
public void GetData(string XMLPath)
{
    ArrayOfWorkerType test;

    XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType));
    test = (ArrayOfWorkerType)xs.Deserialize(new StreamReader(XMLPath)); // <-- statt "GHworkerType.xsd" !!!
    dataGridView1.DataSource = test;
}

Besser aber den StreamReader noch per "using" einkappseln, also:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public void GetData(string XMLPath)
{  
    XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType));
    using (var stream = new StreamReader(XMLPath))
    {
        ArrayOfWorkerType test = (ArrayOfWorkerType)xs.Deserialize(stream);
        dataGridView1.DataSource = test;
    }
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 16:51 
Zitat:
Du mußt ja auch die XML-Datei deserialisieren und nicht die XSD-Datei:


Good catch ;)
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 17:13 
also so:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public void GetData(string XMLPath)
        {

            XmlSerializer xs = new XmlSerializer(typeof(worker));
            using (var stream = new StreamReader(XMLPath)) 
            {
                worker test = (worker)xs.Deserialize(stream);
                dataGridView1.DataSource = test;
            }
            
            
        }


aber die exception ist immer noch da.

hab die XML nochmal mit Notepad++ geöffnet und sie in UTF-8 abgespeichert und die klasse nochmal neu erstellt.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 17:31 
Wo kommt den jetzt worker her und was ist das?

Und die Exception um die es geht gibt ist weiterhin eine 'Fehler im XML-Dokument (an Stelle X)' Exception?
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Do 27.09.12 17:36 
nachdem ich die xml in UTF-8 gespeichert habe und die xsd und die klasse neu erstellt habe, hieß die klasse nicht mehr ArrayOfWorkerType sondern worker.

ja ist immer noch der gleiche Fehler:

Fehler im XML-Dokument (2,2).

hier die "neue" Klasse nochmal:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
//------------------------------------------------------------------------------
// <auto-generated>
//     Dieser Code wurde von einem Tool generiert.
//     Laufzeitversion:4.0.30319.544
//
//     Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
//     der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;
namespace MBG.SimpleWizard
{
}

// 
// Dieser Quellcode wurde automatisch generiert von xsd, Version=4.0.30319.1.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd""4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class worker {
    
    private workerType[] itemsField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("type", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public workerType[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd""4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class workerType {
    
    private string nameField;
    
    private string rateField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string rate {
        get {
            return this.rateField;
        }
        set {
            this.rateField = value;
        }
    }
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 27.09.12 18:05 
Kannst du einfach mal eine passende xml Datei zippen und anhängen?
Ich verliere den Faden bei deinem Problem. Und wenn ich das einfach mal selbst ausprobiere möchte ich mir nicht was aus irgendeinem bisher geposteten Codebroken zusammenbasteln der vielleicht schon gar nicht mehr aktuell ist.
Bl!tz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Fr 28.09.12 07:05 
jetzt hab ich mal im Anhang die XML angehängt.
Einloggen, um Attachments anzusehen!