Hallo,
okay, Weg und Lösung habe ich verstanden. Bischen crazy, aber wenn es so ohne Umwege funktioniert, dann ist es zwar quick `n dirty aber simple.
Also, den SOAP-Fehler zu bereinigen, kann ich nicht einfach das Script anpassen - dafür sind zu viele Variablen im Spiel (z.B. PHP Version, ...). Ich glaube, hier im Forum ist das auch zu speziell.
Meine klare Empfehlung für derartige Coding-Fragen ist
stack overflow! Da wird einem schnell geholfen, weil eine riesige Community weltweit dahinter steht - die zudem - weil nicht typisch Deutsch - einen nicht als erstes zusammenscheißt (wie auch hier öfters).
Last but not least:
Ich würde das XML aber mit zeitgemäßen PHP-Werkzeugen (z.B.
SimpleXMLElement) erstellen.
Ich gebe mal ein Beispiel, das ein bischen komplexer ist, aber dann ist es - glaube ich - besser nachzuvollziehen (man kann ja das wesentliche auf deinen OnePager herunterstrippen):
In carddav2fb gibt es bereits eine Routine, welche Telfonbucheinträge in 1:1-Beziehung als Array liefert, den habe ich minimal ergänzt und bekomme so folgende Telefonbuchdaten - im folgenden in der Variablen
$contacts
- (Ausschnitt):
Code:
[54] => Array
(
[number] => 03302xxxxxx
[id] => 0
[type] => home
[quickdial] => 8
[vanity] =>
[prio] => 1
[name] => Bxxxxx, Dr. Claudia
)
[55] => Array
(
[number] => 0157xxxxxxx
[id] => 1
[type] => mobile
[quickdial] =>
[vanity] =>
[prio] =>
[name] => Bxxxxx, Dr. Claudia
)
[56] => Array
(
[number] => 0511344144
[id] => 0
[type] => work
[quickdial] =>
[vanity] =>
[prio] => 1
[name] => Bildungsverein Hannover
)
Um daraus eine passende XML zu erzeugen habe ich folgendes (hier vereinfacht) codiert:
Code:
$adressBook = new simpleXMLElement("<?xml version='1.0' encoding='utf-8'?><AddressBook />");
foreach ($contacts as $contact) {
$number = (string)$contact['number'];
$realName = htmlspecialchars(str_replace('&', '&', $contact['name']));
$parts = explode(', ', $realName);
if (count($parts) !== 2) {
$lastName = $realName;
$firstName = '';
} else {
$lastName = $parts[0];
$firstName = $parts[1];
}
$contact = $adressBook->addChild('Contact');
$contact->addChild('LastName', $lastName);
$contact->addChild('FirstName', $firstName);
$phone = $contact->addChild('Phone');
$phone->addChild('phonenumber', $number);
$phone->addChild('accountindex', '0');
$groups = $contact->addChild('Groups');
$groups->addChild('groupid', '0');
}
Im Ergebnis wird dann die XML erzeugt, welche als lokales File
$adressbook->asXML('gs_phonebook.xml')
so aussieht:
Code:
<?xml version="1.0" encoding="utf-8"?>
<AddressBook>
...
<Contact>
<LastName>Bxxxxx</LastName>
<FirstName>Dr. Claudia</FirstName>
<Phone>
<phonenumber>03302xxxxx</phonenumber>
<accountindex>0</accountindex>
</Phone>
<Groups>
<groupid>0</groupid>
</Groups>
</Contact>
<Contact>
<LastName>Bxxxxx</LastName>
<FirstName>Dr. Claudia</FirstName>
<Phone>
<phonenumber>0157xxxxxx</phonenumber>
<accountindex>0</accountindex>
</Phone>
<Groups>
<groupid>0</groupid>
</Groups>
</Contact>
<Contact>
<LastName>Bildungsverein Hannover</LastName>
<FirstName/>
<Phone>
<phonenumber>0511344144</phonenumber>
<accountindex>0</accountindex>
</Phone>
<Groups>
<groupid>0</groupid>
</Groups>
</Contact>
...
</AddressBook>
Dein Output wäre dann einfach
echo $adressbook->asXML();
Das FRITZ!Box Telefonbuch würde ich auch nicht empfehlen mit explode() zu zerlegen, sondern das XML entweder mit
foreach()
durchlaufen oder mit
xPath('//contact')
aufdröseln.
Viel Erfolg
Black Senator