1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

XML mit Hilfe XPath in Objekt mappen

Dieses Thema im Forum ".NET Datenverwaltung" wurde erstellt von domeemod, 9. Juni 2015.

  1. domeemod

    domeemod Grünschnabel

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

    HTML:
    1. <Unternehmensliste>
    2.     <Unternehmen>
    3.         <Bezeichnung>DummyFirma GMBH</Bezeichnung>
    4.         <Anzeigename>DummyFirma</Anzeigename>
    5.         <ID>1</ID>
    6.         <Angestellter>
    7.             <idAngestellter>1</idAngestellter>
    8.             <Name>Test</Name>
    9.             <Vorname>Olaf</Vorname>
    10.         </Angestellter>
    11.     </Unternehmen>
    12.     <Unternehmen>
    13.         <Bezeichnung>ABC GMBH</Bezeichnung>
    14.         <Anzeigename>Hersteller A</Anzeigename>
    15.         <ID>2</ID>
    16.         <Angestellter>
    17.             <idAngestellter>26</idAngestellter>
    18.             <Name>Miller</Name>
    19.             <Vorname>Anton</Vorname>
    20.         </Angestellter>
    21.             <Zweigstelle>
    22.                 <Bezeichnung></Bezeichnung>
    23.                 <Anzeigename>Zweigstelle A</Anzeigename>
    24.                 <ID>20</ID>
    25.                 <Angestellter>
    26.                     <idAngestellter>27</idAngestellter>
    27.                     <Name>Test</Name>
    28.                     <Vorname>Testi</Vorname>
    29.                 </Angestellter>
    30.             </Zweigstelle>
    31.     </Unternehmen>
    32. [...]
    33. </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:

    Code (C++):
    1. List<Unternehmen> l_Unternehmen = new List<Unternehmen>();
    Die Unternehmensklasse:
    Code (C++):
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6.  
    7. namespace WindowsFormsApplication1
    8. {
    9.     class Unternehmen
    10.     {
    11.         string Bezeichnung;
    12.         string Anzeigename;
    13.         uint ID;
    14.         List<Angestellter> l_Angestellter;
    15.         List<Unternehmen> l_Zweigstellen;
    16.  
    17.         public Unternehmen()
    18.         {
    19.  
    20.         }
    21.  
    22.         public Unternehmen(string nBezeichnung, uint nID)
    23.         {
    24.             this.Bezeichnung = nBezeichnung;
    25.             this.ID = nID;
    26.             this.l_Angestellter = new List<Angestellter>();
    27.             this.l_Zweigstellen = new List<Unternehmen>();
    28.         }
    29.  
    30.         public string get_Bezeichnung()
    31.         {
    32.             return this.Bezeichnung;
    33.         }
    34.  
    35.         public void get_Bezeichnung(string newBezeichnung)
    36.         {
    37.             this.Bezeichnung = newBezeichnung;
    38.         }
    39.  
    40.         public string get_Anzeigename()
    41.         {
    42.             return this.Anzeigename;
    43.         }
    44.  
    45.         public void set_Anzeigename(string newAnzeigename)
    46.         {
    47.             this.Anzeigename = newAnzeigename;
    48.         }
    49.  
    50.         public List<Angestellter> get_Angestellte()
    51.         {
    52.             return this.l_Angestellter;
    53.         }
    54.  
    55.         public List<Unternehmen> get_Zweigstellen()
    56.         {
    57.             return this.l_Zweigstellen;
    58.         }
    59.  
    60.         public uint get_ID()
    61.         {
    62.             return this.ID;
    63.         }
    64.  
    65.         override public string ToString()
    66.         {
    67.             return this.Bezeichnung;
    68.         }
    69.  
    70.  
    71.     }
    72. }

    Mein bisheriger Versuch:


    Code (C++):
    1.          
    2.  XmlDocument xdoc = new XmlDocument();
    3. foreach (XmlNode unternehmen in xdoc.SelectNodes("/Unternehmensliste/*"))
    4. {                
    5.                     Unternehmen unter = new Unternehmen(unternehmen["Bezeichnung"].InnerText, uint.Parse(unternehmen["ID"].InnerText));
    6.  
    7.                     if(unternehmen["Angestellter"] != null)
    8.                     {
    9.                         foreach (XmlNode angestellter in xdoc.SelectNodes("/Unternehmensliste/Unternehmen/Angestellter"))
    10.                         {
    11.                             Angestellter an = new Angestellter(uint.Parse(angestellter["idAngestellter"].InnerText));
    12.                             unter.get_Angestellte().Add(an);
    13.                         }
    14.                      
    15.                     }
    16.  l_Unternehmen.Add(unter);
    17. }
    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
     
  2. Turri

    Turri Erfahrenes Mitglied

    Hallo,

    in der 2. For-Schleife wo du die Angestellten ausliesst nimmst du wieder
    Code (Text):
    1. foreach (XmlNode angestellter in xdoc.SelectNodes(...
    2. ...
    du solltest aber
    Code (Text):
    1. foreach (XmlNode angestellter in unternehmen.SelectNodes(...
    Sonst bekommst du natürlich jedesmal alle Angestellten, da ja in xdoc ALLE Einträge vorhanden sind.
     
    domeemod gefällt das.
  3. domeemod

    domeemod Grünschnabel

    Danke für die Info. Das war der Fehler.
    Entsprechende Schleife habe ich nun so angepasst:

    Code (C++):
    1. foreach (XmlNode angestellter in unternehmen.SelectNodes("Angestellter"))
    2. {
    3. [...]
    4. }

    Gruß
    domeemod
     
  4. domeemod

    domeemod Grünschnabel

    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?
     
  5. Turri

    Turri Erfahrenes Mitglied

    Sollte eigentlich der ThreadOpener schliessen dürfen
    Schau doch mal ganz oben irgendwo ;)
     
Die Seite wird geladen...