[C#] Fragen zu XML-Knoten auslesen.

Balaezth

Grünschnabel
Hi, vielleicht könnt ihr mir helfen

Es geht um folgendes. Ich möchte Daten aus einer XML auslesen. Auf das Design dieser XML habe ich keinen Einfluss da sie aus einer anderen Quelle stammen. Und sieht folgendermaßen aus: (Die XML ist weit aus größer und enthält mehr Informationen aber das ist der Teil um was es geht)

XML:
<gears>
        <gear>
            <guid>a7759d32-ac8c-48b3-ab24-4d075384ba96</guid>
            <name>Weapon Focus</name>
            <category>Foci</category>
            <capacity />
            <armorcapacity />
            <minrating>0</minrating>
            <maxrating>18</maxrating>
            <rating>6</rating>
            <qty>1</qty>
            <avail>(Rating * 5)R</avail>
            <avail3 />
            <avail6 />
            <avail10 />
            <cost>Rating * 10000</cost>
            <cost3 />
            <cost6 />
            <cost10 />
            <extra>Katana</extra>
            <bonded>True</bonded>
            <equipped>True</equipped>
            <homenode>False</homenode><bonus><selecttext /></bonus><source>SR4</source><page>199</page><response>0</response><firewall>0</firewall><system>0</system><signal>0</signal><gearname /><includedinparent>False</includedinparent><children /><location /><notes /><discountedcost>False</discountedcost>
    </gear>
</gears>

Geladen wird die XML per:
C#:
XmlDocument doc = new XmlDocument();
                doc.Load(DateiPfad);
                XmlElement root = doc.DocumentElement;

Ich möchte die Namen (Das was unter Node Name steht in diesem Fall: Weapon Focus) in eine Combobox laden. Das klappt ganz gut mit:

C#:
XmlNodeList gears = root.SelectNodes("/character/gears/gear");
                foreach(XmlNode gear in gears)
                {
                    cbb_Gear.Items.Add(gear["name"].InnerText);
                }
                cbb_Gear.SelectedIndex = 0;

Wenn jetzt die ganzen Gegenstände in der Combobox sind, möchte ich in zwei Labels das Anzeigen was unter <qty> und <extra> steht. Und genau da liegt der Knackpunkt. Das kriege ich nicht hin denn die Gegenstände fangen ja immer mit <gear> und ohne ID an.
Ich benutze Visual Studio 2013 Express.

Hoffe ihr versteht was ich meine.

Gruß
Balaezth
 
Zuletzt bearbeitet von einem Moderator:
Salut Balaezth

Grundsätzlich gehören C#-Fragen nicht ins C++- sondern ins .NET-Forum, aber hier eine Möglichkeit:

Statt nur den Text des Namens in die ComboBox einzufügen definier einfach eine Klasse, die die nötigen Sachen beinhaltet und die Anzeige dann über ToString anbietet.

C#:
class Gear {
    public string Name { get; private set; }
    public int Quantity { get; private set; }
    public string Extra { get; private set; }

    public Gear(XmlNode node) {
           Name = node["name"].InnerText;
           Quantity = int.Parse(node["qty"].InnerText);
           Extra = node["extra"].InnerText;
    }

    public override string ToString() {
            return Name;
    }
}

// .......
cbb_Gear.Items.Add(new Gear(gear));

Und bei Selection changed, nachdem du geprüft hast, dass SelectedIndex im gültigen Rahmen ist:
C#:
var gear = cbb_Gear.Items[cbb_Gear.SelectedIndex] as Gear; // oder cbb_Gear.SelectedItem as Gear
var quantity = gear?.Quantity ?? -1;

Kannst natürlich auch ne Exception werfen, wenn aus einem Grund das gewählte Item nicht vom Typ Gear ist und daher "as Gear" null zurückgibt.

Viele Grüsse
Cromon
 
Hi, vielen Dank für deine Antwort.

Tut mir leid, wusste nicht so recht wohin mit der Frage aber ich merk es mir :)

Kann ich dir vielleicht mal meinen Code zeigen, das du mir helfen kannst deine Hilfe zu integrieren?
Denn ich muss gestehen das ich das noch nicht so wirklich weiß.

MfG
Bala
 
Zurück