vcf file zu xml konvertieren

supersalzi

Erfahrenes Mitglied
Hey,

Ich würde gern den vcf File (bzw. eine spezielle Textdatei) mittels PHP so umformen, dass eine xml Datei herauskommt.

Das arbeiten mit Textdateien ist mir nicht ganz neu, aber ich scheitere schon daran, wie ich die Datei auslesen soll; Zeilenweise, als String oder als Array um sie sinnvoll weiter zu zerlegen.

Mein erster Versuch war mit explode("END:VCARD", $datei); aber ich kam mit den teilen dann nicht klar.

Wie könnte man an so etwas heran gehen?

Hier mal die Ausgangsdatenform:
Code:
BEGIN:VCARD
VERSION:2.1
N:Mustermann;Max
TEL;WORK:222222222
TEL;HOME:111111111111
EMAIL;INTERNET;PREF:mail@adresse
URL;WORK:www.was.o
TEL;CELL:00000000000
TEL;FAX:88888888
NOTE:Info
ORG:Firma
TITLE:Hr.
TEL:9999999999
ADR;HOME:;;Street;City;Bundesland;01234;Germany
END:VCARD

soll zu folgendem werden:
Code:
<person>
	<name>Max</name>
	<surname>Mustermann</surname>
	<tel>
		<cell>00000000000</cell>
		<home>111111111111</home>
		<work>222222222</work>
		<other>9999999999</other>
	</tel>
	<fax>88888888</fax>
	<address>
		<title>Hr.</title>
		<company>Firma</company>
		<street>Street</street>
		<city>City</city>
		<state>Bundesland</state>
		<zipcode>01234</zipcode>
		<country>Germany</country>
	</address>
	<note>Info</note>
</person>

vielen Dank, salzi
 
Da die VCards wahrscheinlich immer den selben Aufbau haben (?) würde ich einfach per [phpf]file[/phpf] einlesen und mit [phpf]explode[/phpf] anhand des ";" trennen oder mit [phpf]substr[/phpf] abschneiden.
Danach bequem eine XML Datei erstellen (SimpleXML?) oder Dennis' XML Klasse.


/edit:

Gerade noch mal gesucht und dabei bin ich auf diese Klasse gestoßen:
IMC Objects
Description hat gesagt.:
This is a package of classes that are meant to provide an interface to access data of iCalendar and vCard files defined by the IMC (Internet Mail Consortium).

The library can read and write files with the formats defined by IMC.
 
Zuletzt bearbeitet:
Eine bessere Möglichkeit bietet das von PEAR bereitgestellte vCard-Modul, dass man sich auch schnell umschreiben kann,sofern kein PEAR vorhanden ist (auf einigen Servern ist das leider so): Einfach die Aufrufe für PEAR rausnehmen (sind nur ein Paar um Fehler darzustellen) und dann kann man das auch "so" nutzen.

vCard von PEAR bietet problemloses generieren und auslesen von vCards nach standardgerechten Inhalten, die Benutzung läuft wie ein ini-File ;)
 
Ich finde das PEAR Paket ehrlich gesagt nicht so elegant, da es unglaublich verschachtelte Arrays zurückgibt.
 
Hi Felix,

Danke für das Suchen nach der Class aber mir geht es mehr ums selbst machen und verstehen, sorry.

Ich bin der Ansicht die Vcards sind nicht immer gleich, das heißt irgendwie schon, aber nicht ausgefüllte Einträge fehlen einfach. Hier nochmal ein Beispiel eines nicht vollständigen Kontaktes:
Code:
BEGIN:VCARD
VERSION:2.1
N:;Anna
TEL;WORK:071234567
TEL;HOME:071234567
EMAIL;INTERNET;PREF:anna.s@t-online.de
TEL;CELL:071234567
ADR;HOME:;;Hohe Str. 100;Bochum;;0134;
END:VCARD
 
Der Aufbau ist aber prinzipiell der gleiche in jeder Card.
Ich würde das so machen: File einlesen, dann die Zeilen nach "\n" trennen und dann auswerten. Muss man halt sehen, welche Optionen/Werte in einer vCard erlaubt sind bzw vorkommen können und entsprechend nach Felix' Vorschlag weiter nach ";" trennen
 
Hi Felix,

Danke für das Suchen nach der Class aber mir geht es mehr ums selbst machen und verstehen, sorry.

Dann wäre doch die Klasse der perfekte Platz um anzuschauen, wie die Klasse die Datei einliest, die Daten trennt, usw. um es dann in einer eigenen Form umzusetzen bzw. an deine Bedürfnisse anzupassen?
 
da hast du auch wieder recht...

ich muss eh mal sehen, denn ich kann mir es noch nicht richtig denken, viele schleifen wahrscheinlich...

aber danke erstmal, salzi
 
Solltest Du die "DOM XML Erweiterung" installiert haben,
könntest Du das auch so machen:

Achtung: Diese Erweiterung ist EXPERIMENTELL.

PHP:
<?php 

$doc = new DOMDocument('1.0');

$doc->formatOutput = true;

$file = file('vcf_card.txt');

for($i=0;$i < count($file);$i++)
{
   $a[] = explode(':',$file[$i]);
   $b[] = explode(';',$a[$i][1]);
}

$root = $doc->createElement('person');
$root = $doc->appendChild($root);

$name = $doc->createElement('name');
$name = $root->appendChild($name);

$vname = $doc->createTextNode($b[2][1]);
$vname = $name->appendChild($vname);

$surname = $doc->createElement('surname');
$surname = $root->appendChild($surname);

$nname = $doc->createTextNode($b[2][0]);
$nname = $surname->appendChild($nname);

// u.s.w 

//Daten in xml-Datei speichern!
$doc->save("test.xml");
?>
 
Solltest Du die "DOM XML Erweiterung" installiert haben,
könntest Du das auch so machen:

Achtung: Diese Erweiterung ist EXPERIMENTELL.

Also die DOM XML Erweiterung ist keinesfalls mehr experimentell, sondern sogar "überholt" da sie in PHP5 nicht mehr vorhanden ist.
Falls man in PHP5 trotzdem noch DOM nutzen will, gibt es die DOM Extension:
DOM Functions

Allerdings gibt es in PHP5 schönere Funktionen wie die von SimpleXML.
 
Zurück