XML mit Hilfe XPath in Objekt mappen

domeemod

Grünschnabel
Hallo zusammen. Ich hoffe jemand kann mir etwas helfen.
Ich habe folgende XML-Struktur:

HTML:
<Unternehmensliste>
    <Unternehmen>
        <Bezeichnung>DummyFirma GMBH</Bezeichnung>
        <Anzeigename>DummyFirma</Anzeigename>
        <ID>1</ID>
        <Angestellter>
            <idAngestellter>1</idAngestellter>
            <Name>Test</Name>
            <Vorname>Olaf</Vorname>
        </Angestellter>
    </Unternehmen>
    <Unternehmen>
        <Bezeichnung>ABC GMBH</Bezeichnung>
        <Anzeigename>Hersteller A</Anzeigename>
        <ID>2</ID>
        <Angestellter>
            <idAngestellter>26</idAngestellter>
            <Name>Miller</Name>
            <Vorname>Anton</Vorname>
        </Angestellter>
            <Zweigstelle>
                <Bezeichnung></Bezeichnung>
                <Anzeigename>Zweigstelle A</Anzeigename>
                <ID>20</ID>
                <Angestellter>
                    <idAngestellter>27</idAngestellter>
                    <Name>Test</Name>
                    <Vorname>Testi</Vorname>
                </Angestellter>
            </Zweigstelle>
    </Unternehmen>
[...]
</Unternehmensliste>

In dieser Datei sind mehrere Unternehmen gespeichert.
Ein Unternehmen kann n Angestellte und m Zweigstellen haben.
Die Zweigstellen haben wiederum x Angestellte.


Diese Unternehmen möchte ich nun in C# in ein Liste aufnehmen bestehend aus Unternehmen:

C++:
List<Unternehmen> l_Unternehmen = new List<Unternehmen>();

Die Unternehmensklasse:
C++:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApplication1
{
    class Unternehmen
    {
        string Bezeichnung;
        string Anzeigename;
        uint ID;
        List<Angestellter> l_Angestellter;
        List<Unternehmen> l_Zweigstellen;

        public Unternehmen()
        {

        }

        public Unternehmen(string nBezeichnung, uint nID)
        {
            this.Bezeichnung = nBezeichnung;
            this.ID = nID;
            this.l_Angestellter = new List<Angestellter>();
            this.l_Zweigstellen = new List<Unternehmen>();
        }

        public string get_Bezeichnung()
        {
            return this.Bezeichnung;
        }

        public void get_Bezeichnung(string newBezeichnung)
        {
            this.Bezeichnung = newBezeichnung;
        }

        public string get_Anzeigename()
        {
            return this.Anzeigename;
        }

        public void set_Anzeigename(string newAnzeigename)
        {
            this.Anzeigename = newAnzeigename;
        }

        public List<Angestellter> get_Angestellte()
        {
            return this.l_Angestellter;
        }

        public List<Unternehmen> get_Zweigstellen()
        {
            return this.l_Zweigstellen;
        }

        public uint get_ID()
        {
            return this.ID;
        }

        override public string ToString()
        {
            return this.Bezeichnung;
        }


    }
}

Mein bisheriger Versuch:


C++:
 XmlDocument xdoc = new XmlDocument();
foreach (XmlNode unternehmen in xdoc.SelectNodes("/Unternehmensliste/*"))
{                 
                    Unternehmen unter = new Unternehmen(unternehmen["Bezeichnung"].InnerText, uint.Parse(unternehmen["ID"].InnerText));

                    if(unternehmen["Angestellter"] != null)
                    {
                        foreach (XmlNode angestellter in xdoc.SelectNodes("/Unternehmensliste/Unternehmen/Angestellter"))
                        {
                            Angestellter an = new Angestellter(uint.Parse(angestellter["idAngestellter"].InnerText));
                            unter.get_Angestellte().Add(an);
                        }
                     
                    }
 l_Unternehmen.Add(unter);
}

Ich hole mit die Unternehmen und füge sie in die Liste ein für spätere Verarbeitung.
Dies geht auch, nur habe ich immer alle Mitarbeiter bei jedem Unternehmen drin.
Ich denke, dies liegt daran, dass der XPath ("/Unternehmensliste/Unternehmen/Angestellter") nicht stimmt, da dies mir immer alle Angestellten ausliest. Ich möchte aber nur die innerhalb des aktuellen Zweiges.
Gehe ich das so richtig an oder bin ich total auf dem Holzweg?

Selbes Problem habe ich auch mit den Zweigstellen, aber ich denke, das ist die gleiche Ursache.


Gruß
domeemod
 
Hallo,

in der 2. For-Schleife wo du die Angestellten ausliesst nimmst du wieder
Code:
foreach (XmlNode angestellter in xdoc.SelectNodes(...
...
du solltest aber
Code:
foreach (XmlNode angestellter in unternehmen.SelectNodes(...

Sonst bekommst du natürlich jedesmal alle Angestellten, da ja in xdoc ALLE Einträge vorhanden sind.
 
Danke für die Info. Das war der Fehler.
Entsprechende Schleife habe ich nun so angepasst:

C++:
foreach (XmlNode angestellter in unternehmen.SelectNodes("Angestellter"))
{
[...]
}


Gruß
domeemod
 
Wie schon geschrieben hat mir die Antwort geholfen.
Nun wollte ich dieses Thema hier schließen, aber ich weiß nicht wie - oder können dies nur Moderatoren?
 
Sollte eigentlich der ThreadOpener schliessen dürfen
Schau doch mal ganz oben irgendwo ;)
 
Zurück