Entwickler-Ecke

IO, XML und Registry - XML Verschachtelung


bd.cole - Di 28.08.07 08:30
Titel: XML Verschachtelung
Hallo ich lese aus textboxen text für meine xml datei aus. klappt auch alles prima. Wird auch dort rein geschrieben. Aber wie geb ich die Form an, in der er schreiben soll, also würde es gerne verschachteln, dass es z. B. so aussieht:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
- <blub>
      <bla>aa</bla
      <bla2>####</bla2
-     <Adresse>
-         <MeineAdresse>
              <str>xxxxxx</str
              <hausnr>20</hausnr
              <plz>987087</plz
              <ka>99</ka
          </MeineAdresse>
      </Adresse>
  </blub>


Habe eine Serlializationclass. Ich würde gerne in dieser schon die Form festlegen und später nur noch den text aus den textboxen dazufügen. Meine Klasse:

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:
private string bla = String.Empty;
private string bla2 = String.Empty;
private string str = String.Empty;
private string hausnr = String.Empty;
private string plz = String.Empty;
private string ka = String.Empty;

            public string Bla
            {
                get { return bla; }
                set { bla = value; }
            }
            public string Bla2
            {
                get { return bla2; }
                set { bla2 = value; }
            }
            public string Str
            {
                get { return str; }
                set { str = value; }
            }
            public string Hausnr
            {
                get { return hausnr; }
                set { hausnr = value; }
            }


Kha - Di 28.08.07 13:54

Jedes Element repräsentiert ein Objekt. Um Daten zu verschachteln, musst du also diese in eine eigene Klasse packen, die du dann in der "Root-Klasse" als Property benutzt.

Das hier könnte dir helfen - entweder direkt oder als Anregung und Code-Beispiel: http://blogs.msdn.com/mwinkle/archive/2007/05/14/paste-xml-as-serializable-type.aspx


Christian S. - Di 28.08.07 13:56

Wenn Du den XML-Serializer verwenden willst, musst Du die Struktur mit Deinem Klassen nachbilden.

Also wenn Du das hier hast:


XML-Daten
1:
2:
3:
4:
<MeineAdresse>
    <Strasse>...</Strasse>
    <PLZ>...</PLZ>
</MeineAdresse>


musst Du Deine Klasse so bauen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public class MeineAdresse {
  private string strasse;
  public string Strasse {
    get {return strasse;}
    set {strasse = value;}
  }
  
  private string plz;
  public string PLZ{
    get {return plz;}
    set {plz= value;}
  }


Wenn Du weitere Verschachtelungen haben willst, musst Du Properties anlegen, die Instanzen weiterer Klassen sind:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public class Person {
  private string name;
  public string Name{
    get {return name;}
    set {name= value;}
  }

  private MeineAdresse adresse;
  public MeineAdresse Adresse{
    get {return adresse;}
    set {adresse= value;}
  }
}


ergibt:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
<Person>
  <Name>...</Name>
  <Adresse>
    <Strasse>...</Strasse>
    <PLZ>...</PLZ>
  </Adresse>
</Person>



P.s.: Ich weiß, Khabarakh war schneller, aber ich hab mehr Infos drin ;-)


bd.cole - Mi 29.08.07 07:19

erstmal Danke. Hab noch ein Problem. Ich hatte mir ein Object erstellt:


C#-Quelltext
1:
private Person serObj = new Person();                    


Ich habe dann den eingegebenen Text einer textbox gespeichert:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            for (int i = 3; i < 7; i++)
                eingabe = eingabe + maskedTextBox16.Text[i];
            serObj.strasse = eingabe;
            XmlTextWriter xmlWriter = new XmlTextWriter(this.xmlMeldungen, Encoding.UTF8);
            XmlSerializer serializer = new XmlSerializer(typeof(SerializationClass));
            serializer.Serialize(xmlWriter, serObj);
            xmlWriter.Close();

Das geht jetzt natürlcih nicht mehr. Wie speicher ich das jetzt in dem Objekt? Muss ja irgendwie serObj.Adresse.strasse oder so? Es kommt der Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.


JüTho - Mi 29.08.07 08:35

user profile iconbd.cole hat folgendes geschrieben:
Es kommt der Fehler: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Bei den vorherigen Ratschlägen wurde gesagt:
user profile iconChristian S. hat folgendes geschrieben:
Wenn Du weitere Verschachtelungen haben willst, musst Du Properties anlegen, die Instanzen weiterer Klassen sind:

Deine Fehlermeldung lässt mich vermuten, dass im Konstruktor von Person das Erzeugen der "Instanzen weiterer Klassen" fehlt.

Gruß Jürgen


bd.cole - Mi 29.08.07 14:37

Lesen Hilft, Danke. Hat funktioniert. Geht nun alles


bd.cole - Do 30.08.07 09:40

Ok das mit dem Anlegen der XML hat Prima geklappt, aber wie kann ich jetzt einzelne Strings wieder auslesen aus der Datei? Z. B. jetzt strasse?


bd.cole - Do 30.08.07 09:47

Ah ok geht genauso nur mit Xmlreader anstat writer