IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

DomXML et Xpath


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut DomXML et Xpath
    Bonjour à tous !

    Voila mon problème : je souhaite ajouter un noeud XML à un fichier déjà existant, pour cela j utilise donc le dom cependant j ai un problème de ciblage sur un attribut que je ne comprends pas.
    le fichier XML est du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <career>
    	<type genre="1">
    		<offre>
    			<libelle>Branch Manager IMR (M/F)</libelle>
    			<location>Stavanger (Norway) </location>
    			<reference>NR006357-1-12-05</reference>
    		</offre>
    		<offre>
    			<libelle>QHSES Manager (M/F)</libelle>
    			<location>Stavanger (Norway) </location>
    			<reference>NR006357-2-12-05</reference>
    		</offre>
    		<offre>
    			<libelle>Senior Secretary (M/F)</libelle>
    			<location>Stavanger (Norway) </location>
    			<reference>NR006357-3-12-05</reference>
    		</offre>
    	</type>
    	<type genre="2">
    		<offre>
    			<libelle>Branch Manager IMR (M/F)</libelle>
    			<location>Stavanger (Norway) </location>
    			<reference>NR006357-1-12-05</reference>
    		</offre>
    		<offre>
    			<libelle>QHSES Manager (M/F)</libelle>
    			<location>Stavanger (Norway) </location>
    			<reference>NR006357-2-12-05</reference>
    		</offre>
    		<offre>
    			<libelle>Senior Secretary (M/F)</libelle>
    			<location>Stavanger (Norway) </location>
    			<reference>NR006357-3-12-05</reference>
    		</offre>
    	</type>
    </career>
    Voilà si je cherche à ajouter une offre sur type genre 2 par exemple, je fais comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $parent_path = "/career/type";
    $nexti = "//offre";
    $XML_Av = new DOMDocument();
    $XML_Av->load("../available.xml");
    $Xpath = new DomXpath($XML_Av);
    $query = $Xpath->query("//type[@genre='2']");	
    //$query = $Xpath->query($parent_path);
    $above = $Xpath->query($nexti);
    $elementa = $XML_Av->createElement('libelle', $lib);
    $elementb = $XML_Av->createElement('location', $loca);
    $elementc = $XML_Av->createElement('reference', $ref);
    $elementd = $XML_Av->createElement('offre','');
    $query->item(0)->insertBefore($elementd, $above->item(0));
    $elementd->appendChild($elementa);
    $elementd->appendChild($elementb);
    $elementd->appendChild($elementc);
    $XML_Av->save("../available.xml");
    et j'ai comme erreur :
    Fatal error: Uncaught exception 'DOMException' with message 'Not Found Error' in w:\apache\htdocs\technip_careers_xml\admin\func.php:130 Stack trace: #0 w:\apache\htdocs\technip_careers_xml\admin\func.php(130): DOMNode->insertBefore(Object(DOMElement), Object(DOMElement)) #1 w:\apache\htdocs\technip_careers_xml\admin\func.php(166): update_Avail('sqdqsdqsdqs', 'qsdqsd', '2', '1') #2 {main} thrown in w:\apache\htdocs\technip_careers_xml\admin\func.php on line 130
    et si je remplace mon query pour reprendre le premier noued tout betement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = $Xpath->query("/career/type");
    cela focntionne parfaitement, je ne comrpends dons pas pourquoi en recherchant sur un attribut cela plante.
    Avez vous uen idee ?

  2. #2
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut


    Tu a penser a essayer ca :
    '//type[@genre="2"]'
    ou
    "//type"

    Par contre il ne devrait pas te lever une exception mais te retourner une liste vide.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut
    yep j avais essaye...
    Par contre je ne vois pas bien ce que tu veux dire par "//type", alors ja i essaye quelque chose comme ca (avec les balises codes ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $Xpath = new DomXpath($XML_Av);
    $query = $Xpath->query('//type');
    $query = $Xpath->query('@genre="2"');
    Et pour cette solution j ai comme erreur :
    Fatal error: Call to a member function insertBefore() on a non-object in w:\apache\htdocs\technip_careers_xml\admin\func.php on line 131

  4. #4
    Membre émérite Avatar de stunti
    Inscrit en
    Mai 2006
    Messages
    520
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mai 2006
    Messages : 520
    Par défaut
    '//type' veut dire tout les noeuds ayant pour nom type. Donc peut importe le genre.
    par contre as tu essayer ca '//type[@genre="2"]'

    je ne sais pas si les guillemets sont important.

    par contre ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = $Xpath->query('@genre="2"');
    , ca me semble faux.

    Essaye de faire un var_dump de query.

    debug a la roots.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 8
    Par défaut
    Essaies ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    try
    {
    	$dom = new DOMDocument();
    	$dom->load("../available.xml");
     
    	$q = '//tysdfpe[@genre="2"]';
    	$xp = new DOMXPath($dom);
    	$results = $xp->query($q);	
    	if($results->length > 0 )
    	{
    		#on se place sur le premier noeud
    		$node = $results->item(0);
     
                    #on creee les noeuds et on les ajoute au noeud offre
    		$offre = $dom->createElement('offre','mon offre');
    		$libelle = $dom->createElement('libelle', 'toto');
    		$location = $dom->createElement('location', 'titi');
    		$reference = $dom->createElement('reference', 'tata');
    		$offre->appendChild($libelle);
    		$offre->appendChild($location);
    		$offre->appendChild($reference);
     
                    #on ajoute le noeud offre au document
    		$node->appendChild($offre);
     
    		#on sauvegarde ds le fichier
    		$dom->save("../available.xml");';
    	}
    	else throw new Exception('Aucun noeud retourné par la requête : '.$q);
    }
    catch(Exception $e)
    {
    	echo $e->getMessage();
    	echo '<pre>'.$e->getTraceAsString().'</pre>';    
    }

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut
    je viens d essayer ton code ramirou et effectivement cela fonctionne mais ajoute le nouveau noeud à la fin du noeud parent "type".
    Ce qui m'a permis de comprendre que lorque que j'utilise insertBefore l'élément noeud que je mets en deuxième argument doit être faux car il se plante et me fait une erreure de type Not Found...
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    try {	
    		$dom = new DOMDocument();
    		$dom->load("../available.xml");
    		$nexti = "//offre";
     
    		$q = '//type[@id="5"]';
    		$xp = new DOMXPath($dom);
     
    		$results = $xp->query($q);	
    		if( $results->length > 0 ) {
    			$node = $results->item(0);
    			$offre = $dom->createElement('offre','');
    			$libelle = $dom->createElement('libelle', 'toto');
    			$location = $dom->createElement('location', 'titi');
    			$reference = $dom->createElement('reference', 'tata');
    			$offre->appendChild($libelle);
    			$offre->appendChild($location);
    			$offre->appendChild($reference);
    			$above = $xp->query($nexti);
    			$node->insertBefore($offre,$above->item(0));
    			$dom->save("../available.xml");
    	}
    	else throw new Exception('Aucun noeud retourné par la requête : '.$q);
    	}
    	catch(Exception $e)
    	{
    		echo $e->getMessage();
    		echo '<pre>'.$e->getTraceAsString().'</pre>';    
    	}
    mais lorsque je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $nexti = "//offre";
    par
    et bien la cela fonctionne mais ajoute mon nouvel élément à la fin de mon noeud parent...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 8
    Par défaut
    Pour l'utilisation de insertBefore, regarde ici

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 4
    Par défaut
    Coucou pas trop eu le temps de m'y remettre avant mais la grace a ton ptit lien que j avais deja vu mais ptete pas assez regarder ca works !!!
    mille mercis !!
    voici le bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    try {	
    		$dom = new DOMDocument();
    		$dom->load("../available.xml");
    		$nexti = '//type[@id="2"]/offre';
     
    		$q = '//type[@id="2"]';
    		$xp = new DOMXPath($dom);
     
    		$results = $xp->query($q);	
    		if( $results->length > 0 ) {
    			$offre = $dom->createElement('offre',null);
    			$libelle = $dom->createElement('libelle', 'toto');
    			$location = $dom->createElement('location', 'titi');
    			$reference = $dom->createElement('reference', 'tata');
    			$offre->appendChild($libelle);
    			$offre->appendChild($location);
    			$offre->appendChild($reference);
    			$above = $xp->query($nexti);
    			$results->item(0)->insertBefore($offre,$above->item(0));
    			$dom->save("../available.xml");
    	}
    	else throw new Exception('Pas de noeuneue : '.$q);
    	}
    	catch(Exception $e)
    	{
    		echo $e->getMessage();
    		echo '<pre>'.$e->getTraceAsString().'</pre>';    
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM XML] insertbefore()+ XPATH
    Par maiki dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 16/03/2007, 00h12
  2. [DOM XML] Besoin d'aide avec domxml et xpath
    Par vodevil dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 13/02/2006, 14h02
  3. [DOM XML] XPath, Pear, Evaluation Querystring
    Par Bernard Grosdoy dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 08/09/2005, 15h12
  4. XPath: intersection de chemins
    Par aldo047 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 13/03/2003, 10h30
  5. Cours en Français sur XML-XSL et XPath
    Par Community Management dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 25/04/2002, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo