Entwickler-Ecke

IO, XML und Registry - Knoten und deren Inhalte in Abhängig aus xml Datei lesen


syntec - Mo 19.09.11 22:50
Titel: Knoten und deren Inhalte in Abhängig aus xml Datei lesen
Hallo an alle,

ich handtiere gerade mit dem XmlDocument herum, da ich Daten übersichtlich und einfach abspeichern möchte.
Jedenfalls dachte ich es, dass es einfacher wird.
Gerne möchte ich eine xml Datei auslesen, aber nur von bestimmte Knoten deren Inhalt.
Die Datei sieht von der Struktur folgendermaßen aus:

XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
<Eingänge>
 <Kanal>
  <Name>Eingang 1</Name>
   <Einheit>s</Einheit>
   <Einheit>min</Einheit>
   <Einheit>h</Einheit>
   <Comment>erster Eingang Zeit</Comment>
 </Kanal>
  <Name>Eingang 2</Name>
   <Einheit>mm</Einheit>
   <Einheit>m</Einheit>
   <Einheit>km</Einheit>
   <Comment>zweiter Eingang Volumen</Comment>
 </Kanal>

Jetzt möchte ich in eine Listbox nur die Einheiten der zuvor ausgewählten Eingänge, sprich: <Name>XXX</Name>


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
foreach(XmlNode node in xmlDocument.SelectNodes("//Name"))
{
 if(node.InnerText == strAuswahl)
 {
  listBox.Items.Add()
  ...
 }
}

Damit kann ich zwar auf den passenden Knoten drauf zugreifen, aber wie iterativ die Attribute auslesen. Wird bestimmt nicht umfangreich sein, finde aber leider keinen Ansatz.
Könnt ihr mir da bitte weiterhelfen?

Gruß,


dark-destination1988 - Di 20.09.11 09:08

Deine Liste von Einträgen an die listbox Datasource anhängen und listbox.DisplayMember="Name"


syntec - Di 20.09.11 19:15

Hallo und danke,

leider hilft mir das nicht weiter, da ich die Einträge (alle "Einheiten") ja aus der xml Datei auslesen möchte und dann in die Liste einfügen möchte.

mfg,


syntec - Do 22.09.11 20:10

habe es auch mit ChildNodes versucht... ohne Erfolg.
Auch wie es in http://www.c-sharp-forum.de/topic_XML+in+ListView+laden+amp+Imageliste+verknuepfen_106346.html beschrieben ist, das im Prinzip das beinhaltet was ich haben möchte, bringt mir die Fehlermeldung: "Object reference not set to an instance of an object"

Hat keiner eine Idee?


Trashkid2000 - Do 22.09.11 20:53

Hallo,
also so ganz habe ich das Problem nicht verstanden.

Aber ich versuche es trotzdem mal, Dir zu helfen. Mit LinQ To Xml ist die Welt gleich viel einfacher (jedenfalls, wenn man es einmal so halbwegs verstanden hat).
Poste hier einfach mal einen BeispielCode:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 XDocument doc = XDocument.Parse(Resources.TestXml); //hier aus einer Resource geladen

IEnumerable<XElement> kanalElements = doc.Descendants("Kanal");
//die Liste enthält nach Deinem Beispiel 2 Elemente

//das erste Kanal- Element in der Auflistung
var kanalElement = kanalElements.First();
string kanalName = kanalElement.Element("Name").Value;

//Einheiten-Elemente des ersten Kanals 
IEnumerable<XElement> kanalEinheitenElements = kanalElement.Elements("Einheit");

IEnumerable<string> kanalEinheitenElementsValues = kanalEinheitenElements.Select(x => x.Value);
Und nun muss bloß noch die Bindung bzw. Anzeige an der ComboBox realisiert werden.
LG


syntec - So 25.09.11 18:42

Hallo Marko,

Super, konnte heute deinen Vorschlag testen und hab es nach meinen Ansprüchen ummodeln und verwenden können. Vielen Dank dafür.