Obwohl viele Dienstanbieter jetzt JSON-Schnittstellen für uns zur Verfügung stellen, gibt es sie jedoch Es gibt immer noch viele Dienste, die immer noch XML als Schnittstellenformat verwenden müssen, was erfordert, dass wir die Daten im XML-Format analysieren und konvertieren. In PHP gibt es keine Funktionen wie json_encode() und json_decode(), die uns eine einfache Konvertierung ermöglichen. Daher muss bei der Verarbeitung von XML-Daten häufig jeder seinen eigenen Code schreiben, um dies zu erreichen.
Heute stellen wir die Verwendung einiger Objektmethoden in der SPL-Erweiterungsbibliothek vor, um die Konvertierung von XML-Datenformaten durchzuführen. Zuerst definieren wir eine Klasse, was der Kapselung einer Klasse entspricht, die die XML-Datenkonvertierung für unsere zukünftige Verwendung durchführt. Wenn Sie den Effekt nur testen möchten, können Sie die folgende Funktion auch direkt schreiben.
class ConvertXml{ // .... }
XML in PHP-Array konvertieren
class ConvertXml{ public function xmlToArray(SimpleXMLIterator $xml): array { $res = []; for ($xml->rewind(); $xml->valid(); $xml->next()) { $a = []; if (!array_key_exists($xml->key(), $a)) { $a[$xml->key()] = []; } if ($xml->hasChildren()) { $a[$xml->key()][] = $this->xmlToArray($xml->current()); } else { $a[$xml->key()] = (array) $xml->current()->attributes(); $a[$xml->key()]['value'] = strval($xml->current()); } $res[] = $a; } return $res; } // ..... } $wsdl = 'http://flash.weather.com.cn/wmaps/xml/china.xml'; $xml = new SimpleXMLIterator($wsdl, 0, true); $convert = new ConvertXml(); // var_dump($convert->xmlToArray($xml)); // array(37) { // [0]=> // array(1) { // ["city"]=> // array(2) { // ["@attributes"]=> // array(9) { // ["quName"]=> // string(9) "黑龙江" // ["pyName"]=> // string(12) "heilongjiang" // ["cityname"]=> // string(9) "哈尔滨" // ["state1"]=> // string(1) "7" // ["state2"]=> // string(1) "3" // ["stateDetailed"]=> // string(15) "小雨转阵雨" // ["tem1"]=> // string(2) "21" // ["tem2"]=> // string(2) "16" // ["windState"]=> // string(21) "南风6-7级转4-5级" // } // ["value"]=> // string(0) "" // } // } // [1]=> // array(1) { // ["city"]=> // array(2) {
Hier verwenden wir das SimpleXMLIterator-Objekt. Wie aus dem Namen hervorgeht, besteht seine Aufgabe darin, SimpleXMLElement-Objekte zu generieren, die durchlaufen werden können. Der erste Parameter ist ordnungsgemäß formatierter XML-Text oder eine Linkadresse. Der zweite Parameter sind einige Optionsparameter. Hier können wir einfach 0 angeben. Der dritte Parameter gibt an, ob der erste Parameter eine Linkadresse ist. Hier geben wir true an.
Wir haben das SimpleXMLIterator-Objekt auf der Clientseite generiert und es an die xmlToArray()-Methode übergeben. Auf diese Weise können wir mit dem SimpleXMLIterator-Objekt jeden Knoten durchlaufen. Als nächstes müssen wir nur feststellen, ob der Knoten untergeordnete Knoten hat. Wenn keine untergeordneten Knoten vorhanden sind, rufen Sie die Attribute und den Inhalt des Knotens ab.
Dieser Testlink dient zum Abrufen von Wetterinformationen. Jeder Knoten im zurückgegebenen Inhalt hat nur Attribute und keinen Inhalt. Dies spiegelt sich im konvertierten Array wider, in dem das Wertfeld leer ist.
PHP-Array oder -Objekt in XML konvertieren
class ConvertXml{ // ...... const UNKNOWN_KEY = 'unknow'; public function arrayToXml(array $a) { $xml = new SimpleXMLElement('<?xml version="1.0" standalone="yes"?><root></root>'); $this->phpToXml($a, $xml); return $xml->asXML(); } protected function phpToXml($value, &$xml) { $node = $value; if (is_object($node)) { $node = get_object_vars($node); } if (is_array($node)) { foreach ($node as $k => $v) { if (is_numeric($k)) { $k = 'number' . $k; } if (!is_array($v) && !is_object($v)) { $xml->addChild($k, $v); } else { $newNode = $xml->addChild($k); $this->phpToXml($v, $newNode); } } } else { $xml->addChild(self::UNKNOWN_KEY, $node); } } } var_dump($convert->arrayToXml($data)); // string(84454) "<?xml version="1.0" standalone="yes"?> // <root><unlikely-outliner><subject><mongo-db><outline><chapter><getting-started><number0> ........... // "
In arrayToXml() erstellen wir zunächst eine grundlegende Stammknotenstruktur mithilfe des SimpleXMLElement-Objekts. Verwenden Sie dann die Methode phpToXml(), um alle Knoten zu erstellen. Warum es in zwei Methoden aufteilen? Da die phpToXml()-Methode rekursiv aufgerufen werden muss, müssen wir den Wurzelknoten nicht bei jeder Rekursion neu erstellen. Wir müssen nur addChild() unter dem Wurzelknoten verwenden, um untergeordnete Knoten hinzuzufügen.
Im Code von phpToXml() verwenden wir auch die Funktion get_object_vars(). Das heißt, wenn der Inhalt des übergebenen Array-Elements ein Objekt ist, können alle Eigenschaften des Objekts über diese Funktion abgerufen werden. Wenn Sie sich ein Objekt als Array vorstellen, ist jeder Attributwert sein Schlüssel-Wert-Paar.
Beim Durchlaufen jedes Schlüsselwerts bestimmen wir, ob der dem aktuellen Schlüssel entsprechende Inhalt ein Array oder ein Objekt ist. Wenn der Inhalt nicht in diesen beiden Formen vorliegt, wird der aktuelle Inhalt direkt als untergeordneter Knoten des aktuellen Knotens hinzugefügt. Wenn es sich um ein Array oder ein Objekt handelt, fügen Sie rekursiv hinzu, bis der gesamte Array-Inhalt durchlaufen ist.
Der $data-Inhalt des Tests ist sehr lang. Sie können ihn direkt auf Github über den Link zum Testcode überprüfen.
Zusammenfassung
Der Inhalt dieses Artikels besteht lediglich darin, die Verwendung von zwei Objekten in einer SPL-Erweiterungsbibliothek für XML-Operationen zu erlernen. Durch sie können wir das XML-Datenformat problemlos konvertieren. Natürlich haben wir auch andere Methoden zur XML-Formatkonvertierung, die wir später kennenlernen werden!
Testcode:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/Verwenden Sie die Objektmethode in der SPL-Bibliothek, um XML und Array in PHP.php zu konvertieren