Parsing xml - souci de parsing

yishay -  
 Utilisateur anonyme -
Bonjour,

j'aurais besoin d'aide par rapport au parsing xml suivant :
le code suivant me permet de rentrer en base uniquement les données mises en gras en somme le contenu du paragraph_1 ne rentre pas en base de données.
Auriez vous une réponse à me donner ?
merci infiniment d'avance.

<?php
defined( 'ACSSES' ) or die( '' );
$parametres['test'] = array(
"TABLE" => "form", // table cible
"IDTABLE" => "submission_id", // champ compteneur des registres
"ROOT" => "vide", // champ sans action
"REFERENCE" => "idxml", // champ compteneur des registres
"CASINOS" => "sql_requette", // champ compteneur des registres
"URL_IMG" => "http://www.test.com",
"URL_LOCALIZED" => "http://www.test.com",
"PARAGRAPHS" => "vide", // enveloppe PARAGRAPH_1 et PARAGRAPH_2
"PARAGRAPH_1" => "vide", // enveloppe TITLE et CONTENU
"PARAGRAPH_2" => "vide", // enveloppe TITLE et CONTENU
"MJ" => "oui",
);

// tableau de relation entres les champs
$champs_sql['test'] = array(
"IDENTIFIANT" => "codecas",
"ID_RESER" => "idxml",
"TITLE" => "contenu",
"CONTENU" => "type",
"TITLE" => "col_1",
"CONTENU" => "contact",

);

?>
A voir également:

6 réponses

Utilisateur anonyme
 
Salut,

Je ne comprend pas très bien la question mais es-ce normal que dans ton tableau "champs_sql" il y a deux fois TITLE et 2xCONTENU ??
0
yishay
 
Bonjour,

en fait pour être plus clair dans le fichier xml parsé il y a les informations suivantes :
<PARAGRAPHS>
<PARAGRAPH_1>
<TITLE><![CDATA[TITRE v1]]></TITLE>
<CONTENU><![CDATA[texte v1]]></CONTENU>
</PARAGRAPH_1>
<PARAGRAPH_2>
<TITLE><![CDATA[TITRE v2]]></TITLE>
<CONTENU><![CDATA[texte v2]]></CONTENU>
</PARAGRAPH_2>
</PARAGRAPHS>

Merci infiniment pour votre retour.
0
Utilisateur anonyme > yishay
 
Je suis presque d'accord pour la structure, les deux paragraphes sont les mêmes donc moi j'aurai plutot vu
<PARAGRAPHS>

    <PARAGRAPH>
        <TITLE>tata</TITLE>
        <CONTENU>tutu</CONTENU>
    </PARAGRAPH>

    <PARAGRAPH>
        <TITLE>toto</TITLE>
        <CONTENU>titi</CONTENU>
    </PARAGRAPH>

</PARAGRAPHS> 


Ensuite ça ne répond pas à la question du pourquoi 2xTITLE et 2xContenu dans le tableau champs_sql et si tu veux vraiment garder ta structure XML renomme ces deux paramètres par TITLE_1 CONTENU_1 et TITLE_2 CONTENU_2
0
yishay
 
En fait la forme du xml m'est imposé aussi je n'ai pas de choix sinon j'aurais fait ainsi :
<PARAGRAPHS>
<PARAGRAPH_1>
<TITLE1><![CDATA[TITRE v1]]></TITLE1>
<CONTENU1><![CDATA[texte v1]]></CONTENU1>
</PARAGRAPH_1>
<PARAGRAPH_2>
<TITLE2><![CDATA[TITRE v2]]></TITLE2>
<CONTENU2><![CDATA[texte v2]]></CONTENU2>
</PARAGRAPH_2>
</PARAGRAPHS>
Et ainsi traiter l'info comme ça dans le php :
"TITLE1" => "contenu",
"CONTENU1" => "type",
"TITLE2" => "col_1",
"CONTENU2" => "contact",
C'est ça le problème !
Merci beaucoup
0
Utilisateur anonyme
 
Je fais un petit test

<?php

$champs_sql['test'] = array(
"IDENTIFIANT" => "codecas",
"ID_RESER" => "idxml",
"TITLE" => "contenu",
"CONTENU" => "type",
"TITLE" => "col_1",
"CONTENU" => "contact",
); 

foreach($champs_sql['test'] as $key => $val)
	echo "champ_sql['test']['".$key."'] = $val <br/>";
?>


m'affiche

champ_sql['test']['IDENTIFIANT'] = codecas
champ_sql['test']['ID_RESER'] = idxml
champ_sql['test']['TITLE'] = col_1
champ_sql['test']['CONTENU'] = contact 


Dans ta base SQL tu ne peux avoir qu'un seul champ nommé TITLE et un seul CONTENU, ton tableau champs_sql ne marchera pas si tu ne renommes pas !!

T'es obligé de renommer !

et pour la strucure XML le mieux aurait été de faire un paragaphe général et avec un attribut pour l'identifier:
<PARAGRAPHS>
   <PARAGRAPH id="1">
      <TITLE>le titre</TITLE>
      <CONTENU>le contenu</CONTENU>
   </PARAGRAPH>
   <PARAGRAPH id="2">
      <TITLE>le titre</TITLE>
      <CONTENU>le contenu</CONTENU>
   </PARAGRAPH>
</PARAGRAPHS> 

0
yishay
 
Et oui je sais mais y a t-il un moyen de renommer directement au niveau du fichier php :
$champs_sql['test'] = array(
"IDENTIFIANT" => "codecas",
"ID_RESER" => "idxml",
"PARAGRAPH_1.TITLE" => "contenu",
"PARAGRAPH_1.CONTENU" => "type",
"PARAGRAPH_2.TITLE" => "col_1",
"PARAGRAPH_2.CONTENU" => "contact",
);

ça ne marche mais y a t-il une solution possible dans ce genre la ?
0
Utilisateur anonyme
 
J'ai fais ça et ça marche

<?php

$champs_sql['test'] = array(
"IDENTIFIANT" => "codecas",
"ID_RESER" => "idxml",
"TITLE" => array("PARAGRAPHE_1"=>"contenu","PARAGRAPHE_2"=>"col_1"),
"CONTENU" => array("PARAGRAPHE_1"=>"type", "PARAGRAPHE_2"=>"contact"),
); 

foreach($champs_sql['test'] as $key => $val)
	if(is_array($champs_sql['test'][$key]))
		foreach($champs_sql['test'][$key] as $key2 => $val2)
			echo "champ_sql['test']['$key']['$key2'] = $val2 <br/>";
	else
		echo "champ_sql['test']['$key'] = $val <br/>";
		
?>


affiche

champ_sql['test']['IDENTIFIANT'] = codecas
champ_sql['test']['ID_RESER'] = idxml
champ_sql['test']['TITLE']['PARAGRAPHE_1'] = contenu
champ_sql['test']['TITLE']['PARAGRAPHE_2'] = col_1
champ_sql['test']['CONTENU']['PARAGRAPHE_1'] = type
champ_sql['test']['CONTENU']['PARAGRAPHE_2'] = contact 


Au lieu des paragraphe_x comme argument tu peux aussi utiliser des nombres

<?php

$champs_sql['test'] = array(
"IDENTIFIANT" => "codecas",
"ID_RESER" => "idxml",
"TITLE" => array(0=>"contenu",1=>"col_1"),
"CONTENU" => array(0=>"type",1=>"contact"),
); 

foreach($champs_sql['test'] as $key => $val)
	if(is_array($champs_sql['test'][$key]))
		for($i=0; $i<count($champs_sql['test'][$key]); $i++)
			echo "champ_sql['test']['$key']['$i'] = ".$champs_sql['test'][$key][$i]." <br/>";
	else
		echo "champ_sql['test']['".$key."'] = $val <br/>";
?>


affiche

champ_sql['test']['IDENTIFIANT'] = codecas
champ_sql['test']['ID_RESER'] = idxml
champ_sql['test']['TITLE']['0'] = contenu
champ_sql['test']['TITLE']['1'] = col_1
champ_sql['test']['CONTENU']['0'] = type
champ_sql['test']['CONTENU']['1'] = contact 
0
yishay
 
malheureusement, ça ne rentre pas les infos du xml en base.
je sèche complètement !
0
Utilisateur anonyme
 
Là tu as bien séparé en PHP les champs des paragraphes.

Mais dans ta BDD tu dois avoir des champs différents. Sinon tu peux concaténer les deux titres et mettre un séparateur.

par exemple :

$titre_sql = "title1"."###"."title2";
echo "Chaine à insérer : $titre_sql<br/><br/>";

Donc ta base de données le champs TITRE contiendra cette chaine qui est la concaténation des deux titres des deux paragraphes.

Et quand tu veux récupérer les deux champs

$titre_recup = explode("###", $titre_sql);
echo "Titre 1 : $titre_recup[0] <br/>";
echo "Titre 2 : $titre_recup[1] <br/>";


affiche

Chaine à insérer : title1###title2

Titre 1 : title1
Titre 2 : title2


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yishay
 
En fait, c'est bien ça le problème je ne peux rien changé à part mes codes en php je suis bloqué sur toute la partie xml.
Mais n'y a t-il pas moyen de réaliser des correspondances en somme faire correspondre le premier TITLE à TITRE1 et enfin permettre l'insertion en base dans le champ 'contenu' le contenu du xml soit :" TITRE v1".
0
Utilisateur anonyme
 
Je comprends pas ce que tu veux faire, j'ai essayé d'y répondre du mieux que je pouvais, mais là je comprends vraiment plus rien !
0
yishay > Utilisateur anonyme
 
je te remercie infiniement pour ton aide.
En fait mon gros soucis est le suivant :
Je ne peux ajouter des 1 ou 2 au variables titre et contenu je suis donc bloque car si ces dernières etaient définies ainsi alors tout aurait bien fonctionné.
Aujourd'hui mon souci est de faire en sorte que le titre du paragraph 1 rentre dans le champs 'contenu' de la table.
Que le contenu du paragraphe 1 rentre dans le champs 'type'
Que le titre du paragraphe 2 rentre dans le champs 'col_1'
et enfin que le contenu du paragraphe 2 rentre dans le champs 'contact' de la table test.
La seule solution que je voyais été que le titre du paragraphe 1 devenait titre1 directement dans le php.
mais je ne sais pas comment réaliser cette correspondance qui est reproductible au contenu du paragraphe 1, titre du paragraphe 2, contenu du paragraphe 2.
Merci beaucoup dans tous les cas pour ton aide.
0
Utilisateur anonyme
 
Si je résume, tu as la structure suivante, je modifie le contenu pour que se soit plus clair :
<PARAGRAPHS>
   <PARAGRAPH_1>
      <TITLE>titreP1</TITLE>
      <CONTENU>contentP1</CONTENU>
   </PARAGRAPH_1>
   <PARAGRAPH_2>
      <TITLE>titreP2</TITLE>
      <CONTENU>contentP2</CONTENU>
   </PARAGRAPH_2>
</PARAGRAPHS> 


Dans ta base de données, tu as entre autres les champs 'contenu', 'type', 'col_1' et 'contact' dans la table 'test'
Tu veux mettre :
- "titreP1" dans 'contenu'
- "contentP1" dans 'type'
- "titreP2" dans 'col_1'
- "contentP2" dans 'contact'

C'est bien ça ?!

Tu n'as pas la main sur le XML ni sur la base mais uniquement sur le PHP.

Déjà ta partie PHP je ne la comprends pas du tout, ce n'est ni du SQL ni du XML...
pour moi ça ressemble plus à ça https://www.commentcamarche.net/contents/805-php-parser-du-xml

0