Hi Leute,
mir ist es schon ein wenig peinlich, wieder um Rat fragen zu müssen. Nur sitze ich mal wieder auf dem Schlauch. Ich bin dabei, ein Script zu schreiben, dass den Austausch zwischen zwei Datenbanken realisieren soll. Der Abgleich etc. funktioniert prima, das einlesen eines XML-Dokumentes und ausgeben als XML Dokument funktioniert einwandfrei - wären da nicht die verdammten XML-Attribute. Diese machen mir mal wieder das Leben schwer, da ich damit nicht wirklich viel erfahrung hab. Die Logik an sich ist nicht schwer:
Zu erst muss geprüft werden, wie viele <user> es gibt, dann wie viele <user-groups> und dann letztendlich wie viele <user-group> - Tags. Daraus kann man ein Schleife bilden, die dies ausgibt. Hier die XML-Datei:
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>
</profile>
</user>
</organization>
</userimport>
Ist nur eine Beispiel-XML. Hier ist die PHP-Datei:
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 überprü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);
//echo $eintragen;
$groupmax = count($profile[$i])-6;
//echo $groupmax."<br>";
//hier beginnt die Ausgabe der XML-Elemente
$tmp = 0;
for($j = 0; $j <= $groupmax; $j++){
//echo "j: ".$j."<br>";
$department = $user_groups[$j]->attributes();
echo "Department: ".$department;
echo "<br>";
$rolemax = count($user_groups[$j]);
//echo "rolemax: ".$rolemax."<br>";
for($k = $tmp; $k <= $rolemax; $k++){
//echo "k: ".$k."<br>";
$role = $user_role[$k]->attributes();
echo "Role: ".$role;
echo "<br>";
$tmp = $k+1;
//echo "<br>TEMP:".$tmp."<br>";
}
}
}
//for($i = 0;$i <= $max;$i++){
// for($j = 0;$j <= count($profile[0])-5;$j++){
// $department[$j] = $user_groups[$j]->attributes();
// //var_dump($department[$j]);
// echo $j."Department: ".$department[$j]."<br>";
// }
// $tmp = 0;
// for($p = $tmp;$p <= count($user_groups[1])-1;$p++){
// $role = $user_role[$p]->attributes();
// echo "Role: ".$role."<br>";
// $tmp = $p;
// }
//}
?>
Mittels
PHP-Code:
$groupmax = count($profile[$i])-6;
ermittle ich, wie viele <user-groups>-Tags es gibt. Dann ermittle ich via
PHP-Code:
$rolemax = count($user_groups[$j]);
wie viele <user-group>-Tags es gibt.
Zumindest ist dies mein versuch, die Daten richtig auszugeben. Derzeit erhalte ich folgende Ausgabe:
Code:
Department: AbteilungA
Role: Beschaffer
Role: Standard-Mitarbeiter
Role: Genehmigender
Department: AbteilungB
Role: Standard-Mitarbeiter
Role: Aushilfe
Department: AbteilungC
Department: AbteilungA
Role: Beschaffer
Role: Standard-Mitarbeiter
Role: Genehmigender
Department: AbteilungB
Role: Standard-Mitarbeiter
Role: Aushilfe
Department: AbteilungC
Department: AbteilungD
Department: AbteilungE
Doch dies ist nicht so gaaaanz korrekt. Denn in die DB soll später
LoginID, Department (Abteilung) und Role gespeichert werden. Das Insert in der ersten for-Schleife funktioniert prima. Nur das richtige Auslesen der Elemente funzt nicht. Das die LoginID nicht ausgegeben wird, ist mir schon klar, warum. Nur sollte halt unter AbteilungA auch:
- Beschaffer
- Standard-Mitarbeiter
unter Abteilung B:
- Genehmigender
- Standard-Mitarbeiter
- Aushilfe
- Zivi
usw.
... stehen
Das Ausgeben der einzelnen Abteilungen ist auch kein Problem. Nur gibt er es dann 2x aus bzw. so oft, wie User. Also x* AbteilungA bis AbteilungX.
ich weiß, ich verlange von euch zu viel, aber ein Denkanstoß wäre nett. Foreach hat mir auch nicht wirklich geholfen. Vielen Dank schonmal für die große Mühe.
LG
Moritz