Xml::arrayToXml fails on nested arrays
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 65/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- php
- Bereich
- testing-qa
Rechercherichtung
Beginne bei der Xml::arrayToXml-Hilfsfunktion und reproduziere das Beispiel für verschachtelte Arrays aus dem Issue. Untersuche den rekursiven Zweig, in dem das verschachtelte Element übergeben wird, bevor es existiert, und verifiziere anschließend, dass das Beispiel das erwartete verschachtelte XML ohne PHP-Fehler erzeugt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
The helper function arrayToXml has code indended to handle nested arrays, but currently always throws PHP errors. This means nested arrays can't be used when testing soap functions with array data either.
Reproduce
Code:
$dom = new \DOMDocument();
$array = [
'foo' => [
'bar' => '1'
]
];
echo \Codeception\Util\Xml::arrayToXml($dom, $dom, $array)->saveXML();
Expected output:
<?xml version="1.0"?>
<foo><bar>1</bar></foo>
Result:
Undefined property: DOMDocument::$foo
Cause
When the function encounters an array, it calls itself to parse the array, with $domNode->$el as the new $domNode parameter. The problem is that that node ->$el will never exist, since that's the node this function was supposed to create in the first place.
Fix
Create a new element first, to pass to the recursive call, and then append that new node to the xml structure.
Current code:
if (is_array($val)) {
self::arrayToXml($xml, $domNode->$el, $val);
} else {
$domNode->appendChild($xml->createElement($el, $val));
}
Fixed code:
if (is_array($val)) {
$elementNode = $xml->createElement($el);
self::arrayToXml($xml, $elementNode, $val);
$domNode->appendChild($elementNode);
} else {
$domNode->appendChild($xml->createElement($el, $val));
}
Alternatively, we could make it a little more consistent by always creating and appending the element in the same way, and only set the value inside the if-condition. That code would look like this:
$elementNode = $xml->createElement($el);
if (is_array($val)) {
self::arrayToXml($xml, $elementNode, $val);
} else {
$elementNode->nodeValue = $val;
}
$domNode->appendChild($elementNode);
Both solutions result in working code for nested arrays.
- Vorherrschende Sprache
- PHP
- Sterne
- 17
- Forks
- 1
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus Codeception/lib-xml
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 45/100
Codeception/lib-xml#6 · 1 Kommentar ·
Alle Issues in Codeception/lib-xml
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
Broken pathsOffen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 88/100
Automattic/custom-metadata#167 ·
-
Daemon delete dialog: "Remove all ExApps" checkbox and `removeExApps` parameter have no effectOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
Maintainer antworten meist innerhalb von 3 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 90/100
Maintainer antworten meist innerhalb von 1 Tag