In diesem Artikel erfahren Sie, wie Sie die Objektmethode in der SPL-Bibliothek zum Konvertieren von XML und Arrays in PHP verwenden. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Obwohl viele Dienstanbieter mittlerweile JSON-Schnittstellen für uns bereitstellen, gibt es immer noch viele Dienste, die XML als Schnittstellenformat verwenden müssen, was erfordert, dass wir 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{ // .... }
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.
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.
Der Inhalt dieses Artikels ist eine einfache Studie über die Verwendung von zwei Objekten in einer SPL-Erweiterungsbibliothek für XML-Operationen. Durch sie können wir problemlos XML-Datenformate 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/在PHP中使用SPL库中的对象方法进行XML与数组的转换.php
Empfohlenes Lernen: php-Video-Tutorial
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Objektmethoden in der SPL-Bibliothek, um XML in Arrays in PHP zu konvertieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!