Dieser Blog Post ist Teil der Reihe Produkte bei eBay listen.
- Teil 1: XML-Feed
- Teil 2: XML Dateien mit PHP erstellen
- Teil 3: Keys, Sandbox und AddFixedPriceItem
- Teil 4: Aufträge löschen, Artikel aktualisieren
2.1. XMLWriter
Für das Schreiben von XML in PHP wird hier die XMLWriter Klasse verwendet, sie sollte eigentlich überall vorhanden sein. Als erstes wird ein Objekt erstellt.
$writer = new XMLWriter();
Mit dem folgenden Code kann man zwischen Ausgabe im Browser/auf der Konsole und dem Schreiben in eine .xml-Datei hin- und herschalten.
if ($DEBUG) {
$writer->openURI('php://output');
} else {
$filename = 'AddFixedPriceItem.xml';
touch($filename);
$writer->openURI($filename);
}
Der XMLWriter macht allerdings keine Absätze und so würden die folgende Anweisungen alles in eine Zeile schreiben. Prinzipiell ist das natürlich erstmal nicht unbedingt ein Problem. Allerdings wird eBay die Datei ab einer bestimmten Zeilenlänge nicht mehr akzeptieren, (wahrscheinlich) da die Zeilenanzahl ein Kriterium für die maximale Größe von BulkDataExchangeRequests sind.
$writer->setIndent(true);
Bevor die Elemente geschrieben werden, wird erst einmal das Dokument mit Version und Encoding begonnen.
$writer->startDocument('1.0', 'UTF-8');
Ergebnis:
<?xml version="1.0" encoding="UTF-8"?>
Ab jetzt können beliebig Elemente geschrieben werden. Übergeordnete Elemente können mit den folgenden Befehlen geöffnet und geschlossen werden. Dabei ist beim Schließen der Name egal, es zählt die Reihenfolge. Gerade in Schleifen sollte man hier also genau hinsehen.
$writer->startElement('BulkDataExchangeRequests');
...
$writer->endElement();
Ergebnis:
<BulkDataExchangeRequest>
...
</BulkDataExchangeRequest>
Soll ein Element mit einem Wert geschrieben werden wird der folgende Befehl verwendet
$writer->writeElement('SiteID', '77');
Ergebnis
<SiteID>77</SiteID>
Nun gibt es noch den seltenen Fall, dass in einem Tag noch ein Attribut vorhanden ist. Dies wird folgendermaßen realisiert:
$writer->startElement('ShippingServiceCost');
$writer->writeAttribute('currency', 'EUR');
$writer->text('0.0');
$writer->endElement();
Ergebnis:
<ShippingServiceCost currency="EUR">0.0</ShippingServiceCost>
Zuletzt sollte das Dokument noch geschlossen und der Puffer geschrieben (entweder in die Ausgabe oder in die Datei) werden:
$writer->endDocument();
$writer->flush();
2.2. Dateien zippen
In den Beispielen, die in Teil 3 benutzt werden, wird die .xml-Datei noch komprimiert, bevor sie hochgeladen wird. Dies kann mit dem folgenden Snippet umgesetzt werden.
if (!$DEBUG) {
$gzfile = $filename . ".gz";
$fp = gzopen($gzfile, 'w9');
gzwrite($fp, file_get_contents($filename));
gzclose($fp);
}