[C#] XML-Datenwerte speichern und eine ID geben


Halfbax

Erfahrenes Mitglied
Guten Abend :)

Ich habe ein Problem, welches mich seit längeren aufhält. Es handelt sich hierbei um einen relativ einfacher Ablauf.
Ich lade eine XML-Datei diese wird im späteren Verlauf ausgewertet. Die genannte XML-Datei enthält Objekte nach folgenden Schema
Code:
<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Object>
	<IMC>80</IMC>
	<WM_main>
		<WM_sub>Test1</WM_sub>
		<WM_sub>Test2</WM_sub>
		<WM_sub>Test3</WM_sub>
	</WM_main>
  </Object>

  <Object>
	<IMC>90</IMC>
	<WM_main>
		<WM_sub>Test1_2</WM_sub>
		<WM_sub>Test2_2</WM_sub>
		<WM_sub>Test3_2</WM_sub>
		<WM_sub>Test4_2</WM_sub>
	</WM_main>
  </Object> 
</Root>
Object soll unendlich oft verarbeitbar sein. Außerdem sind die Anzahl an WM_sub oft verschieden


Ich hatte mir das so gedacht für jedes Object in der XML wird folgendes getan. Und zwar sollen die Werte in eine Art Array o.a gespeichert werden. Bsp:
Code:
IMC=90, WM_sub[1]=Test1, WM_sub[2]=Test2 ...

Ich möchte das Ganze gerne so speichern, da ich nach IMC wähle und dann zufällig einer der dazugehörigen WM_sub Werte für meine Aufgabe verwenden.

__________________________________

Ich scheichtere leider schon bei der Foreach-Schleife da mir der Gedankengang dafür fehlt :/
Ich verlange kein Copy&Paste, dennoch würde es mir helfen, da ich dann eine "Musterlösung" hätte.

LG,
Halfbax
 

Halfbax

Erfahrenes Mitglied
Ich lade das ganze via XElement.Load.

Mein bisheriger versuch dies zu lösen, aber ich stecke mal wieder fest.

Code:
         try
            {
                var xmlRoot = XElement.Load(string.Format(@"{0}\Plugins\CommunicationBuddy\Wordlists\Wordlist.xml", Application.StartupPath));

                var option1 = from IMC_temp in xmlRoot.Descendants("IfMessageContains")
                              select IMC_temp.Value;

                var option2 = from WM_temp in xmlRoot.Descendants("WhisperMessage")
                              select WM_temp.Value;

                var option3 = from AltMessage_temp in xmlRoot.Descendants("Alternative")
                              select AltMessage_temp.Value;


                foreach (var IMC_temp in option1)
                {

                        IMC.Add(IMC_temp);

                        int imcwm = 0;

                        foreach (var WM_temp in option2)
                        {

                            WM.Add(WM_temp);
                            imcwm++;
                        }

                        for(int i = 0; i <= imcwm; i++)
                        {
                        
                            IMC.Add("wd");
                        }
                }


                foreach (var AltMessage_temp in option3)
                {

                    AltMessage = AltMessage_temp;
                }

            }
            catch(Exception e)
            {

                Logging.Write("Failed to load wordlist.xml @ {0}", e);
            }
Wichtig zu wissen, XML-Namen sind anders.

wd soll einen Platzhalter darstellen und sollte im günstigsten Fall( wenn alles klappt ) so oft vorhanden sein wie RechnungAnzahl von WM - Anzahl von IMC.
 

Mohag

Mitglied
Das sind keine Datensäzte, sondern Datenobjekte.

Stell es dir wie eine nicht gößendefinierte Struktur vor.

System.Xml.Linq.XCData.ReadFrom

sollte dir da weiter helfen..

MfG
Edit:

XmlSerializer
Wenn man mit Objekten arbeitet, legt man eine Klasse, oder eine Struktur an.
Diese kennzeichnet man dann mit dem Marker [Serializable()] so können die Daten so abgelet werden das sie auch wieder geladen werden können.
Dazu gibt X verschiedene Serializer im .NET, von Xml über Stream bis Binary.

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter als Beispiel.

Code:
[Serializable()]
public class CClientData 
{ 
       string sMeinString { get; private set; }
       public CClientData(string MeinString)
       {
               this.sMeinString = MeinString;
        }
        
        public ~CClientData();
}
 
Zuletzt bearbeitet: