les clés et les valeurs sont échangées - vous pouvez résoudre ce problème avec array_flip()avant le array_walk. array_walk_recursivenécessite PHP 5. vous pouvez utiliser à la array_walkplace, mais vous n'entrerez pas 'stack' => 'overflow'dans le xml alors.
Cela ne fonctionnera pas si $ test_array a 'more_another_array' comme 'another_array', car la clé 'another_array' n'est pas convertie. Vous aurez donc plusieurs '<overflow> pile </overflow>'.
comprendre
11
Le array_flipne fonctionnera pas car il ne peut pas retourner les tableaux (comme l' another_arrayintérieur du tableau principal).
Lode
14
Où est l'élément xml "another_array"? Tout est
aplati
2
A très bien fonctionné lorsque j'ai ajouté array_flip avant array_walk_recursive. Merci.
Mike Purcell
12
Downvoting car array_flipne fonctionne que si le tableau ne contient pas de valeurs identiques.
Martijn
385
Voici le code php 5.2 qui convertira un tableau de n'importe quelle profondeur en document xml:
Cela, l'OMI, est une bien meilleure solution que la réponse acceptée. Cependant, cela a la limitation qu'avec les tableaux à clé numérique, il génère du XML mal formé. <0> <1> <2> ne sont pas des noms de noeud valides.
KOGI
2
Cependant, si votre tableau à clé numérique ne contient qu'un autre tableau qui n'est pas à clé numérique, il ne le fera pas.
Bryan Petty
15
@KOGI J'ai modifié la réponse de Hanmant. Maintenant, il prend en charge les tableaux à plusieurs niveaux. pastebin.com/pYuXQWee
Mifas
1
Cet exemple échappe explicitement les caractères spéciaux dans les données de texte d'élément à l'aide de htmlspecialchars, mais SimpleXMLElement :: addChild traduit automatiquement les caractères spéciaux xml en leurs entités char afin que htmlspecialchars puisse être omis. Fait intéressant, cela ne semble pas entraîner de données à double fuite.
mbaynton
3
@Alex, votre édition # 5 fait échouer l'exemple. Il insère <item $ x> avant chaque enregistrement <student>, ce qui rend la sortie XML non conforme à l'intention de l'auteur. Peut-être fournir un exemple du problème que vous essayez de résoudre et nous pouvons trouver une autre solution pour les deux cas. Cela m'a pris un certain temps avant de réaliser que le code des auteurs avait été modifié.
Nicholas Blasgen
124
Les réponses fournies ici convertissent uniquement les tableaux en XML avec des nœuds, vous ne pouvez pas définir d'attributs. J'ai écrit une fonction php qui vous permet de convertir un tableau en php et également de définir des attributs pour des nœuds particuliers dans le xml. L'inconvénient ici est que vous devez construire un tableau d'une manière particulière avec peu de conventions (uniquement si vous souhaitez utiliser des attributs)
L'exemple suivant vous permettra également de définir des attributs en XML.
Je suis surpris que personne n'ait réagi à ce sujet. Cette classe est vraiment utile car elle fait le contraire de ce que générera simpleXMLElement. Il vous donne donc la possibilité d'utiliser SimpleXMLElement dans les deux sens.
FMaz008
4
Je le marquerais comme réponse au lieu de courant. Réponse actuelle ne pas créer de tableaux récursifs
Oleksandr IY
2
Belle classe. J'ai modifié la ligne 128 if(!is_array($arr)) {pour if(!is_array($arr) && $arr !== '') {qu'elle n'ajoute pas un nouveau nœud de texte pour les chaînes vides et conserve donc le format de balise vide abrégé, c'est 'tag'=>''-à- dire <tag/>au lieu de<tag></tag>
user1433150
C'est la meilleure réponse jusqu'à présent. Cela a également la structure correcte de plusieurs éléments avec la même clé: le premier est la clé du nom du nœud, puis il contient le tableau avec des clés numériques. (l'opposé de la réponse Hanmant)
J'ai trouvé toutes les réponses pour utiliser trop de code. Voici un moyen simple de le faire:
function to_xml(SimpleXMLElement $object, array $data){foreach($data as $key => $value){if(is_array($value)){
$new_object = $object->addChild($key);
to_xml($new_object, $value);}else{// if the key is an integer, it needs text with it to actually work.if($key ==(int) $key){
$key ="key_$key";}
$object->addChild($key, $value);}}}
Ensuite, il suffit d'envoyer le tableau dans la fonction, qui utilise la récursivité, de sorte qu'il gérera un tableau multidimensionnel:
J'adore le plus cette solution. Bien, ce serait bien d'ajouter un test sur les touches numériques, comme: if ( is_numeric( $key ) ) $key = "numeric_$key"; .
wout
@wout Bonne prise. Ajoutée. J'ai fait une vérification de cast int au lieu de is_numeric car is_numeric peut donner des résultats, bien que techniquement attendus, qui vous décourageraient vraiment.
Francis Lewis
J'utilise cette fonction, mais j'ai changé $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rootTag/>');pour un encodage UTF-8 valide.
Daantje
Je aime cette solution le plus aussi bien, simple fait il :-) Une remarque: Vous voudrez peut - être changer $object->addChild($key, $value);pour $object->addChild($key, htmlspecialchars($value));l'empêcher de ne pas quand $ la valeur contient des caractères tels que « et » que XML-encodage besoin.
Si l'une des clés du tableau est nommée "corps", cela ne fonctionne pas - plus précisément, la clé est ignorée et parcourue. Essayer de comprendre pourquoi.
Bambax
@Bambax La seule raison pour laquelle je peux penser est si le XML est analysé en HTML à un moment ultérieur.
Donc de toute façon ... J'ai pris le code d'Onokazu (merci!) Et ajouté la possibilité d'avoir des balises répétées en XML, il prend également en charge les attributs, j'espère que quelqu'un le trouvera utile!
Il pourrait être utile de commenter vos modifications pour rendre le code plus clair; encore, belle addition
StormeHawke
Cela a fonctionné pour moi avec WP All Export. J'ai dû changer légèrement la partie is_numeric: if (is_numeric($k)) { $i = $k + 1; $child = $xml->addChild("_$i"); array_to_xml($v, $child); }
performer
4
J'utilise quelques fonctions que j'ai écrites il y a quelque temps pour générer le xml pour passer de PHP à jQuery, etc. ) ...
S'il est utile à n'importe qui, veuillez l'utiliser :)
Pour y parvenir, le code est ci-dessous, mais soyez très prudent, il est récursif et peut en fait provoquer un stackoverflow :)
function addElements(&$xml,$array){
$params=array();foreach($array as $k=>$v){if(is_array($v))
addElements($xml->addChild($k), $v);else $xml->addAttribute($k,$v);}}function xml_encode($array){if(!is_array($array))
trigger_error("Type missmatch xml_encode",E_USER_ERROR);
$xml=newSimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><'.key($array).'/>');
addElements($xml,$array[key($array)]);return $xml->asXML();}
Vous voudrez peut-être ajouter des vérifications de la longueur du tableau afin que certains éléments soient définis à l'intérieur de la partie de données et non comme attribut.
function get_formatted_xml(SimpleXMLElement $xml, $domver =null, $preserveWhitespace =true, $formatOutput =true){// http://stackoverflow.com/questions/1191167/format-output-of-simplexml-asxml// create new wrapper, so we can get formatting options
$dom =newDOMDocument($domver);
$dom->preserveWhiteSpace = $preserveWhitespace;
$dom->formatOutput = $formatOutput;// now import the xml (converted to dom format)/*
$ix = dom_import_simplexml($xml);
$ix = $dom->importNode($ix, true);
$dom->appendChild($ix);
*/
$dom->loadXML($xml->asXML());// printreturn $dom->saveXML();}//-- fn get_formatted_xml
La plupart des réponses ci-dessus sont correctes. Cependant, j'ai trouvé cette réponse qui résout le problème de compatibilité array_walk_recursive et également le problème des clés numériques. Il a également réussi tous les tests que j'ai effectués:
function arrayToXML(Array $array,SimpleXMLElement&$xml){foreach($array as $key => $value){// None arrayif(!is_array($value)){(is_numeric($key))? $xml->addChild("item$key", $value): $xml->addChild($key, $value);continue;}// Array
$xmlChild =(is_numeric($key))? $xml->addChild("item$key"): $xml->addChild($key);
arrayToXML($value, $xmlChild);}}
J'ai également ajouté une classe de test pour cela qui peut vous être utile:
classArrayToXmlTestextendsPHPUnit_Framework_TestCase{publicfunction setUp(){}publicfunction tearDown(){}publicfunction testFuncExists(){
$this->assertTrue(function_exists('arrayToXML'));}publicfunction testFuncReturnsXml(){
$array = array('name'=>'ardi','last_name'=>'eshghi','age'=>31,'tel'=>'0785323435');
$xmlEl =newSimpleXMLElement('<root/>');
arrayToXml($array, $xmlEl);
$this->assertTrue($xmlEl instanceOf SimpleXMLElement);}publicfunction testAssocArrayToXml(){
$array = array('name'=>'ardi','last_name'=>'eshghi','age'=>31,'tel'=>'0785323435');
$expectedXmlEl =newSimpleXMLElement('<root/>');
$expectedXmlEl->addChild('name', $array['name']);
$expectedXmlEl->addChild('last_name', $array['last_name']);
$expectedXmlEl->addChild('age', $array['age']);
$expectedXmlEl->addChild('tel', $array['tel']);
$actualXmlEl =newSimpleXMLElement('<root/>');
arrayToXml($array, $actualXmlEl);
$this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());}publicfunction testNoneAssocArrayToXml(){
$array = array('ardi','eshghi',31,'0785323435');// Expected xml value
$expectedXmlEl =newSimpleXMLElement('<root/>');foreach($array as $key => $value)
$expectedXmlEl->addChild("item$key", $value);// What the function produces
$actualXmlEl =newSimpleXMLElement('<root/>');
arrayToXml($array, $actualXmlEl);
$this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());}publicfunction testNestedMixArrayToXml(){
$testArray = array("goal","nice","funny"=> array('name'=>'ardi','tel'=>'07415517499',"vary","fields"=> array('small','email'=>'[email protected]'),'good old days'),"notes"=>"come on lads lets enjoy this","cast"=> array('Tom Cruise','Thomas Muller'=> array('age'=>24)));// Expected xml value
$expectedXmlEl =newSimpleXMLElement('<root/>');
$expectedXmlEl->addChild('item0', $testArray[0]);
$expectedXmlEl->addChild('item1', $testArray[1]);
$childEl = $expectedXmlEl->addChild('funny');
$childEl->addChild("name", $testArray['funny']['name']);
$childEl->addChild("tel", $testArray['funny']['tel']);
$childEl->addChild("item0","vary");
$childChildEl = $childEl->addChild("fields");
$childChildEl->addChild('item0','small');
$childChildEl->addChild('email', $testArray['funny']['fields']['email']);
$childEl->addChild("item1",'good old days');
$expectedXmlEl->addChild('notes', $testArray['notes']);
$childEl2 = $expectedXmlEl->addChild('cast');
$childEl2->addChild('item0','Tom Cruise');
$childChildEl2 = $childEl2->addChild('Thomas Muller');
$childChildEl2->addChild('age', $testArray['cast']['Thomas Muller']['age']);// What the function produces
$actualXmlEl =newSimpleXMLElement('<root/>');
arrayToXml($testArray, $actualXmlEl);
$this->assertEquals($expectedXmlEl->asXML(), $actualXmlEl->asXML());}}
Cela a un effet inattendu de création de XML de style RPC avec des éléments comme methodCall, methodName, scalaires et vecteurs, etc. Il ne s'agit pas vraiment de convertir un tableau en XML au sens simple.
Volomike
3
SI le tableau est associatif et correctement codé, il serait probablement plus facile de le transformer en xml en premier. Quelque chose comme:
puis pour chaque partie de votre tableau, utilisez quelque chose de similaire à ma boucle de création de texte et utilisez à la place les fonctions simplexml "addChild" pour chaque nœud du tableau.
Je vais essayer cela plus tard et mettre à jour ce message avec les deux versions.
Ce bit où j'ai mentionné "<array> </array>" m'a fait réaliser que la version chaîne avait besoin de quelque chose de similaire. Fondamentalement, le tableau doit avoir un nœud à l'extérieur. Laissez-moi dormir sur le tout, je vais avoir quelque chose qui rattrape cette erreur initiale tout de suite.
Anthony
2
Juste une modification sur une fonction ci-dessus, quand une touche est numérique, ajoutez un préfixe "key_"
// initializing or creating array
$student_info = array(your array data);// creating object of SimpleXMLElement
$xml_student_info =newSimpleXMLElement("<?xml version=\"1.0\"?><student_info></student_info>");// function call to convert array to xml
array_to_xml($student,$xml_student_info);//saving generated xml file
$xml_student_info->asXML('file path and name');function array_to_xml($student_info,&$xml_student_info){foreach($student_info as $key => $value){if(is_array($value)){if(!is_numeric($key)){
$subnode = $xml_student_info->addChild("$key");
array_to_xml($value, $subnode);}else{
$subnode = $xml_student_info->addChild("key_$key");
array_to_xml($value, $subnode);}}else{if(!is_numeric($key)){
$xml_student_info->addChild("$key","$value");}else{
$xml_student_info->addChild("key_$key","$value");}}}}
Vous pouvez utiliser la fonction suivante dans votre code directement,
function artoxml($arr, $i=1,$flag=false){
$sp ="";for($j=0;$j<=$i;$j++){
$sp.=" ";}foreach($arr as $key=>$val){
echo "$sp<".$key.">";if($i==1) echo "\n";if(is_array($val)){if(!$flag){echo"\n";}
artoxml($val,$i+5);
echo "$sp</".$key.">\n";}else{
echo "$val"."</".$key.">\n";}}}
Appelez la fonction avec le premier argument comme tableau et le deuxième argument doit être 1, ce sera augmenté pour une indentation parfaite, et le troisième doit être vrai.
par exemple, si la variable de tableau à convertir est $ array1, alors l'appel serait, la fonction d'appel devrait être encapsulée avec une <pre>balise.
artoxml ($ array1,1, true);
Veuillez consulter la source de la page après avoir exécuté le fichier, car les symboles <et> ne seront pas affichés dans une page html.
Vous pouvez utiliser xmlrpc_encode pour créer un xml à partir d'un tableau si un xml détaillé n'est pas un problème.
www.php.net/xmlrpc_encode
attention le xml créé diffère si vous utilisez des touches associatives et / ou numériques
<?php
// /params/param/value/struct/member// there is a tag "member" for each element// "member" contains a tag "name". its value is the associative key
$xml1 = xmlrpc_encode(array('a'=>'b','c'=>'d'));
$simplexml1 = simplexml_load_string($xml1);
print_r($xml1);
print_r($simplexml1);// /params/param/value/array/data// there is a tag "data" for each element// "data" doesn't contain the tag "name"
$xml2 = xmlrpc_encode(array('a','b'));
$simplexml2 = simplexml_load_string($xml2);
print_r($xml2);
print_r($simplexml2);?>
Cette fonction n'est pas prise en charge et, en fait, n'est pas fournie dans mes versions de PHP 5.2.16 ou PHP 5.3.5. (renvoie "PHP Fatal error: Call to undefined function xmlrpc_encode ()")
danorton
vous devez décommenter la ligne suivante dans php.ini: extension = php_xmlrpc.dll
w35l3y
@ w35l3y J'ai vérifié mon ini. Il ne contient même pas cette extension et j'utilise la v 5.3.6.
Ma réponse, bricolant les réponses des autres. Cela devrait corriger l'échec de la compensation des touches numériques:
function array_to_xml($array, $root, $element){
$xml =newSimpleXMLElement("<{$root}/>");foreach($array as $value){
$elem = $xml->addChild($element);
xml_recurse_child($elem, $value);}return $xml;}function xml_recurse_child(&$node, $child){foreach($child as $key=>$value){if(is_array($value)){foreach($value as $k => $v){if(is_numeric($k)){
xml_recurse_child($node, array($key => $v));}else{
$subnode = $node->addChild($key);
xml_recurse_child($subnode, $value);}}}else{
$node->addChild($key, $value);}}}
La array_to_xml()fonction suppose que le tableau se compose d'abord de touches numériques. Si votre tableau avait un élément initial, vous supprimeriez les instructions foreach()et $elemde la array_to_xml()fonction et passeriez simplement à la $xmlplace.
J'aurais commenté la deuxième réponse la plus votée, car elle ne préserve pas la structure et génère un mauvais XML s'il y a des tableaux internes indexés numériquement.
J'ai développé ma propre version sur cette base, car j'avais besoin d'un simple convertisseur entre json et xml quelle que soit la structure des données. Ma version préserve les informations des clés numériques et la structure du tableau d'origine. Il crée des éléments pour les valeurs indexées numériquement en encapsulant les valeurs dans les éléments nommés par valeur avec l'attribut clé qui contient la clé numérique.
Réponses:
une courte:
résulte en
les clés et les valeurs sont échangées - vous pouvez résoudre ce problème avec
array_flip()
avant le array_walk.array_walk_recursive
nécessite PHP 5. vous pouvez utiliser à laarray_walk
place, mais vous n'entrerez pas'stack' => 'overflow'
dans le xml alors.la source
array_flip
ne fonctionnera pas car il ne peut pas retourner les tableaux (comme l'another_array
intérieur du tableau principal).array_flip
ne fonctionne que si le tableau ne contient pas de valeurs identiques.Voici le code php 5.2 qui convertira un tableau de n'importe quelle profondeur en document xml:
le XML généré serait:
Extrait PHP
Documentation
SimpleXMLElement::asXML
utilisée dans cet extraitla source
Les réponses fournies ici convertissent uniquement les tableaux en XML avec des nœuds, vous ne pouvez pas définir d'attributs. J'ai écrit une fonction php qui vous permet de convertir un tableau en php et également de définir des attributs pour des nœuds particuliers dans le xml. L'inconvénient ici est que vous devez construire un tableau d'une manière particulière avec peu de conventions (uniquement si vous souhaitez utiliser des attributs)
L'exemple suivant vous permettra également de définir des attributs en XML.
La source peut être trouvée ici: https://github.com/digitickets/lalit/blob/master/src/Array2XML.php
la source
if(!is_array($arr)) {
pourif(!is_array($arr) && $arr !== '') {
qu'elle n'ajoute pas un nouveau nœud de texte pour les chaînes vides et conserve donc le format de balise vide abrégé, c'est'tag'=>''
-à- dire<tag/>
au lieu de<tag></tag>
J'ai trouvé toutes les réponses pour utiliser trop de code. Voici un moyen simple de le faire:
Ensuite, il suffit d'envoyer le tableau dans la fonction, qui utilise la récursivité, de sorte qu'il gérera un tableau multidimensionnel:
Maintenant, $ xml contient un bel objet XML basé sur votre tableau exactement comme vous l'avez écrit.
la source
if ( is_numeric( $key ) ) $key = "numeric_$key";
.$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rootTag/>');
pour un encodage UTF-8 valide.$object->addChild($key, $value);
pour$object->addChild($key, htmlspecialchars($value));
l'empêcher de ne pas quand $ la valeur contient des caractères tels que « et » que XML-encodage besoin.la source
$k = (is_numeric($k)) ? 'item' : $k;
à l'intérieur duforeach()
Depuis PHP 5.4
la source
Une autre amélioration:
Usage:
la source
Voici mon entrée, simple et propre ..
la source
Donc de toute façon ... J'ai pris le code d'Onokazu (merci!) Et ajouté la possibilité d'avoir des balises répétées en XML, il prend également en charge les attributs, j'espère que quelqu'un le trouvera utile!
la source
if (is_numeric($k)) { $i = $k + 1; $child = $xml->addChild("_$i"); array_to_xml($v, $child); }
J'utilise quelques fonctions que j'ai écrites il y a quelque temps pour générer le xml pour passer de PHP à jQuery, etc. ) ...
S'il est utile à n'importe qui, veuillez l'utiliser :)
Amour à tous :)
la source
Je voulais un code qui prendra tous les éléments d'un tableau et les traitera comme des attributs, et tous les tableaux comme des sous-éléments.
Donc, pour quelque chose comme
J'obtiendrais quelque chose comme ça
Pour y parvenir, le code est ci-dessous, mais soyez très prudent, il est récursif et peut en fait provoquer un stackoverflow :)
Vous voudrez peut-être ajouter des vérifications de la longueur du tableau afin que certains éléments soient définis à l'intérieur de la partie de données et non comme attribut.
la source
Basé sur tout le reste ici, gère les indices + attributs numériques via le préfixe avec
@
, et pourrait injecter du xml dans les nœuds existants:Code
Usage
Résultat
Bonus: formatage XML
la source
Voici une fonction qui a fait l'affaire pour moi:
Appelez-le simplement avec quelque chose comme
la source
Vous pouvez utiliser le XMLParser sur lequel je travaille.
Se traduirait par:
la source
J'ai trouvé cette solution similaire au problème d'origine
la source
La plupart des réponses ci-dessus sont correctes. Cependant, j'ai trouvé cette réponse qui résout le problème de compatibilité array_walk_recursive et également le problème des clés numériques. Il a également réussi tous les tests que j'ai effectués:
J'ai également ajouté une classe de test pour cela qui peut vous être utile:
la source
autre solution:
la source
SI le tableau est associatif et correctement codé, il serait probablement plus facile de le transformer en xml en premier. Quelque chose comme:
L'autre voie serait de créer d'abord votre xml de base, comme
puis pour chaque partie de votre tableau, utilisez quelque chose de similaire à ma boucle de création de texte et utilisez à la place les fonctions simplexml "addChild" pour chaque nœud du tableau.
Je vais essayer cela plus tard et mettre à jour ce message avec les deux versions.
la source
Juste une modification sur une fonction ci-dessus, quand une touche est numérique, ajoutez un préfixe "key_"
la source
Vous pouvez utiliser la fonction suivante dans votre code directement,
Appelez la fonction avec le premier argument comme tableau et le deuxième argument doit être 1, ce sera augmenté pour une indentation parfaite, et le troisième doit être vrai.
par exemple, si la variable de tableau à convertir est $ array1, alors l'appel serait, la fonction d'appel devrait être encapsulée avec une
<pre>
balise.Veuillez consulter la source de la page après avoir exécuté le fichier, car les symboles <et> ne seront pas affichés dans une page html.
la source
la source
Cette fonction retourne par exemple une liste de balises XML <obj>...</obj> <obj> ... </obj> pour les index numériques.
Contribution:
Production:
Cela devrait satisfaire tous les besoins communs. Vous pouvez peut-être changer la 3e ligne en:
ou si vous travaillez avec des pluriels se terminant par s:
la source
Avec FluidXML, vous pouvez générer, à partir d'un tableau PHP , un XML pour SimpleXML avec ... seulement deux lignes de code.
Un exemple de tableau pourrait être
https://github.com/servo-php/fluidxml
la source
Vous pouvez utiliser xmlrpc_encode pour créer un xml à partir d'un tableau si un xml détaillé n'est pas un problème. www.php.net/xmlrpc_encode
attention le xml créé diffère si vous utilisez des touches associatives et / ou numériques
la source
la source
Ma réponse, bricolant les réponses des autres. Cela devrait corriger l'échec de la compensation des touches numériques:
La
array_to_xml()
fonction suppose que le tableau se compose d'abord de touches numériques. Si votre tableau avait un élément initial, vous supprimeriez les instructionsforeach()
et$elem
de laarray_to_xml()
fonction et passeriez simplement à la$xml
place.la source
J'aurais commenté la deuxième réponse la plus votée, car elle ne préserve pas la structure et génère un mauvais XML s'il y a des tableaux internes indexés numériquement.
J'ai développé ma propre version sur cette base, car j'avais besoin d'un simple convertisseur entre json et xml quelle que soit la structure des données. Ma version préserve les informations des clés numériques et la structure du tableau d'origine. Il crée des éléments pour les valeurs indexées numériquement en encapsulant les valeurs dans les éléments nommés par valeur avec l'attribut clé qui contient la clé numérique.
Par exemple
array('test' => array(0 => 'some value', 1 => 'other'))
convertit en
<test><value key="0">some value</value><value key="1">other</value></test>
Ma version de array_to_xml -function (j'espère que cela aide quelqu'un :)
la source
La structure XML entière est définie dans $ data Array:
la source
Si vous travaillez dans magento et que vous avez ce type de tableau associatif
il est préférable de convertir le tableau associatif au format xml. Utilisez ce code dans le fichier contrôleur.
J'espère que cela aide à tous.
la source
la source