Ankündigung

Einklappen
Keine Ankündigung bisher.

XML Elemnet ausgeben & in DB eintragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • XML Elemnet ausgeben & in DB eintragen

    Hi Leute,

    hab ein kleines Problem mit der programmier-logik.

    In einer XML Datei sind User gespeichert. Jeder User kann einer oder mehreren Gruppen (Abteilungen) angehören. Innerhalb dieser gruppen gibt es bestimmte Rollen, die von User zu User, Abteilung zu Abteilung unterschiedlich sein können. Ein Beispiel-Auszug aus der XML-Datei:
    Code:
    <user>
    <...>
    				<user-groups id="AbteilungA">
    					<user-group id="Beschaffer"/>
    					<user-group id="Standard-Mitarbeiter"/>
    				</user-groups>
    				<user-groups id="AbteilungB">
    					<user-group id="Genehmigender"/>
    					<user-group id="Standard-Mitarbeiter"/>
    					<user-group id="Aushilfe"/>
    					<user-group id="Zivi"/>
    				</user-groups>		
    </...>
    </user>
    (<...> & </...> sind jeweils Platzhalter für weitere Tags)

    Diese "IDs" sollen mitsamt der login-id, die weiter oben im XML-Dokument vorhanden ist, in eine DB eingetragen werden. Dies habe ich mittels folgendem Code versucht, klappt teilweise auch:

    PHP-Code:
    $j 0;
    $i 0;
    for(
    $u 0;$u <= $anz_user;$u++){
        echo 
    "<br>".$login_id[$u];
        
    $count_groups count($profile[$u])-6;
        
        foreach(
    $profile[$u] as $key){
        
            echo 
    "<br>".$user_groups[$i]->attributes()."<br>";
                    
            foreach(
    $user_groups[$i] as $key){
                echo 
    $user_role[$j]->attributes()."<br>";
                
    $j++;
            }
            
    $i++;
        }
        

    Dies erzeugt folgende Ausgabe:
    mustermann
    AbteilungA
    Beschaffer
    Standard-Mitarbeiter

    AbteilungB
    Genehmigender
    Standard-Mitarbeiter
    Aushilfe
    Zivi

    hier sollte "deich" stehen, die loginid des zweiten users

    AbteilungC
    Standard-Mitarbeiter
    Azubi

    AbteilungD
    Standard-Mitarbeiter
    Azubi

    AbteilungE
    Leiter
    Senior

    AbteilungF
    Betreuer
    Gruppenleiter

    AbteilungG
    Betreuer
    Gruppenleiter

    hier würde, sofern weitere user vorhanden wären, nach dem selben schema verlaufen: loginid, Abteilungen, rollen

    Fatal error: Call to a member function attributes() on a non-object in C:\xampplite\htdocs\kdb_test\xml_to_mysql.php on line 80
    Der Fehler liegt daran, das er die erste foreach-Schleife zu häufig durchläuft. Denn in diesem Array sind alle "IDs" der Tags <user-groups> gespeichert. Der erste User hat jedoch nur 2.

    Auf die einzelnen Tags greiffe ich per "xpath" zu. Kann mir da einer weiterhelfen, wie ich es hinbekomme, das ich zu der ichtigigen loginid die richtigen Abteilungen und Rollen in einer DB gespeichert bekomme? Wenn ich die Ausgabe habe, ist das Umwandeln in ein MySQL Befehl ein Kinderspiel. Mir mangelt es nur gerade an der Programmier-Logik

    Danke für eure Hilfe! Ich bin über jeden Denkanstoß sehr dankbar...!

  • #2
    Mir ist nicht ganz klar was genau du bewirken möchtest. Ich sehe eine for-i-Struktur mit zwei foreach-Schleifen. Woher kommt $anz_user?

    Kommentar


    • #3
      Zitat von dsentker Beitrag anzeigen
      Mir ist nicht ganz klar was genau du bewirken möchtest. Ich sehe eine for-i-Struktur mit zwei foreach-Schleifen. Woher kommt $anz_user?
      Stimmt, diese gehört nicht mehr dahin. Diese sollte den Wert der Anzahl der User in dem XML-Dokument beinhalten. Dies habe ich jetzt so gelöst:

      PHP-Code:
      $xmlmax $xml->xpath('/userimport/organization');
      $max count($xml); 
      Dies zählt die <user>-Tags in dem XML Dokument. Denn solange User vorhanden soll er die Gruppen des jeweiligen Users ausgeben und die dazugehörigen Rollen.

      Unten hab ich nun die gesamte Datei und die gesamte XML-Datei gepostet, damit die Struktur eventuell klarer wird.

      Ich bin derzeit dabei, ein Datenaustausch zwischen zwei verschiedenen Datenbanken mittels XML zu gewährleisten. Das System kennt auch verschiedene Abteilungen, die in den IDs des "<user-groups>"-Tags gespeichert sind. In den "<user-groups>"-Tags sind die Rollen, die der User in der jeweiligen Abteilung hat. Ich versuche gerade, genau dies in eine Datenbank zu übernehmen. Das heißt, in die Tabelle, nennen wir sie mal "gruppen", soll die login-id mit den Abteilungen (<user-groups>) und den zu den Abteilungen gehörenden Rollen (<user-group>) gespeichert werden. Die Tabelle sieht so aus:

      loginid | abteilung | rolle

      Mein Problem ist es nun, dies zu realisieren. Das XML-Dokument in eine Datenbank zu speichern, funktioniert auch. Da benötige ich ja nur den Inhalt zwischen den Tags. Für die Abteilungen jedoch die "id" der jeweiligen Tags. Der oben gepostete Code-Snippet ist mein Versuch, dies zu realisieren. Testweise hab ich es ersteinmal ausgegeben. Wie es derzeit aussieht, sieht man oben ebenso.

      Also, nach der normalen Logik muss zu erst geprüft werden, wie viele User es gibt. Dieser Wert steht bei mir in "$max". Danach muss bei dem ersten User geprüft werden, wie viele Abteilungen vorhanden sind. Dies hatte ich mal mit einer for-Schleife probiert gehabt, aber geholfen hatte es nichts. Und letztendlich muss geprüft werden, wie viele "Rollen" in der jeweiligen Abteilung vorhanden sind.

      Soweit so gut. Genau so wie mir das Erklären etwas schwer fällt, fällt mir das Programmieren dieser Logik schwer.

      Also, irgendwie muss ich es so hinbekommen, das ich das so in eine DB speichern kann.

      Und hier der komplette XML-Code:
      Code:
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <userimport>
      	<organization id="BehoerdeA">
      		<user>
      			<profile>
      				 <credentials>
      					<login-id>mustermann</login-id>
      					<password>muster123</password>
      					<enabled>1</enabled>
      					<memoryQuestion>Name des Hundes?</memoryQuestion>
      					<memoryAnswer>Mo</memoryAnswer>
      				</credentials>
      				<first-name>Peter</first-name>
      				<last-name>Mustermann</last-name>
      				<title>Dr.</title>
      				<middleName>von</middleName>
      				<addresses>
      					<address name="Default Address">
      						<city>Wiesbaden</city>
      						<postal-code>56780</postal-code>
      						<street>Frankfurter Str. 1</street>
      						<street2>Raum 47</street2>
      						<phone-business-direct>0621 / 6560 - 100</phone-business-direct>
      						<email>peter.mustermann@localhost</email>
      					</address>
      				</addresses>	
      				<user-groups id="AbteilungA">
      					<user-group id="Beschaffer"/>
      					<user-group id="Standard-Mitarbeiter"/>
      				</user-groups>
      				<user-groups id="AbteilungB">
      					<user-group id="Genehmigender"/>
      					<user-group id="Standard-Mitarbeiter"/>
      					<user-group id="Aushilfe"/>
      					<user-group id="Zivi"/>
      				</user-groups>		
      			</profile>
      		</user>
      		<user>
      			<profile>
      				 <credentials>
      						<login-id>deich</login-id>
      						<password>deich123</password>
      						<enabled>1</enabled>
      						<memoryQuestion>Name der Katze?</memoryQuestion>
      						<memoryAnswer>Miau</memoryAnswer>
      				</credentials>
      				<first-name>Dieter</first-name>
      				<last-name>Deich</last-name>
      				<title></title>
      				<middleName></middleName>
      				<addresses>
      					<address name="Default Address">
      						<city>Paderborn</city>
      						<postal-code>33104</postal-code>
      						<street>Briloner Str. 1</street>
      						<street2>Raum 46</street2>
      						<phone-business-direct>05251 / 6510 - 100</phone-business-direct>
      						<email>dieter.deich@localhost</email>
      					</address>
      				</addresses>
      				<user-groups id="AbteilungC">
      					<user-group id="Standard-Mitarbeiter"/>
      					<user-group id="Azubi"/>
      				</user-groups>
      				<user-groups id="AbteilungD">
      					<user-group id="Standard-Mitarbeiter"/>
      					<user-group id="Azubi"/>
      				</user-groups>
      				<user-groups id="AbteilungE">
      					<user-group id="Leiter"/>
      					<user-group id="Senior"/>
      				</user-groups>
      				<user-groups id="AbteilungF">
      					<user-group id="Betreuer"/>
      					<user-group id="Gruppenleiter"/>
      				</user-groups>
      				<user-groups id="AbteilungG">
      					<user-group id="Betreuer"/>
      					<user-group id="Gruppenleiter"/>
      				</user-groups>
      			</profile>
      		</user>
      	</organization>
      </userimport>
      Und hier der php-Code:
      PHP-Code:
      <?php  
      require("config.php");

      //Datenbankverbindung
       
      mysql_connect("$kdb_db_host","$kdb_db_user","$kdb_db_password") OR DIE ("Die Verbindung zur Datenbank konnte nicht aufgebaut werden. Bitte Adresse, Benutzername und Passwort &uuml;berpr&uuml;fen!");
       
      mysql_select_db("$kdb_db_name") OR DIE ("Die angegebene Datenbank konnte nicht gefunden werden!");

      //pdf erzeugung
      include("fpdf.php");

      //angabe zum pfad der xml-datei und speichern in eine variable
      $file "beispiel_xml.xml";
      $xml simplexml_load_file($file);

      //dateigröße in variable speichern
      $xmlmax $xml->xpath('/userimport/organization');
      $max count($xml);

      //speichern der werte in ein array
      $login_id $xml->xpath('/userimport/organization/user/profile/credentials/login-id');
      $password $xml->xpath('/userimport/organization/user/profile/credentials/password');
      $enabled $xml->xpath('/userimport/organization/user/profile/credentials/enabled');
      $memoryQuestion $xml->xpath('/userimport/organization/user/profile/credentials/memoryQuestion');
      $memoryAnswer $xml->xpath('/userimport/organization/user/profile/credentials/memoryAnswer');

      $first_name $xml->xpath('/userimport/organization/user/profile/first-name');
      $last_name $xml->xpath('/userimport/organization/user/profile/last-name');
      $title $xml->xpath('/userimport/organization/user/profile/title');
      $middleName $xml->xpath('/userimport/organization/user/profile/middleName');

      $city $xml->xpath('/userimport/organization/user/profile/addresses/address/city');
      $postal_code $xml->xpath('/userimport/organization/user/profile/addresses/address/postal-code');
      $street $xml->xpath('/userimport/organization/user/profile/addresses/address/street');
      $phone_business_direct $xml->xpath('/userimport/organization/user/profile/addresses/address/phone-business-direct');
      $email $xml->xpath('/userimport/organization/user/profile/addresses/address/email');

      $user_groups $xml->xpath('/userimport/organization/user/profile/user-groups');
      $user_role $xml->xpath('/userimport/organization/user/profile/user-groups/user-group');

      $profile $xml->xpath('/userimport/organization/user/profile');
      //echo count($user_groups[1]);




      $j 0;
      for(
      $i 0$i <= $max$i++){

      //echo "i: ".$i."<br>";    

          
          
      $enabled_int intval($enabled[$i]);
          
      $postal_code_int intval($postal_code[$i]);
          
          
      //eintrag in Datenbank
          
      $insert "INSERT INTO kdb (loginid, password, enabled, memoryquestion, memoryanswer, firstname, lastname, title, middlename, city, postalcode, street, phonebusinessdirect, email) VALUES ('$login_id[$i]', '$password[$i]', '$enabled_int', '$memoryQuestion[$i]', '$memoryAnswer[$i]', '$first_name[$i]', '$last_name[$i]', '$title[$i]', '$middleName[$i]', '$city[$i]', '$postal_code_int', '$street[$i]', '$phone_business_direct[$i]', '$email[$i]')";
          
      $eintragen mysql_query($insert);
          
          

      $groupmax count($profile[$i])-6;



          
          
      }

      echo 
      $max;

          
      $j 0;
      $i 0;
      for(
      $u 0;$u <= $max;$u++){
          echo 
      "<br>".$login_id[$u];
          
      $count_groups count($profile[$u])-6;
          
          foreach(
      $profile[$u] as $key){
          
              echo 
      "<br>".$user_groups[$i]->attributes()."<br>";
                      
              foreach(
      $user_groups[$i] as $key){
                  echo 
      $user_role[$j]->attributes()."<br>";
                  
      $j++;
              }
              
      $i++;
          }
          
      }

      ?>

      Kommentar


      • #4
        Mir ist nicht ganz klar warum Du das vorher immer alles zählen willst...
        Du kannst doch einfach mit foreach durch die "user" und die dazugehörigen "groups" durchloopen.

        PHP-Code:
        $fname 'beispiel_xml.xml';
        $document =  new SimpleXmlIterator($fnamenulltrue);
        $data $document[0]->xpath('/userimport/organization/user');
        $ugs 'user-groups';
        echo 
        '<pre>';
        foreach( 
        $data as $user){
            
        print_r$user->profile->credentials);
            foreach(
        $user->profile->$ugs as $group){
                
        print_r($group);
            }

        AFFE ist nur im Dezimalsystem ein Palindrom.

        Kommentar

        Lädt...
        X