Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2011, 09h27   #1
Invité régulier
 
Homme Pierre
Étudiant
Inscription : mai 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : mai 2011
Messages : 15
Points : 5
Points : 5
Par défaut Compter le nombre de fois ou une balise apparait dans un fichier xml.

bonjour je cherche a compter le nombre de foi s ou une balise est presente dans mon fichier xml . J'ai cherche sur pas mal de forum peut etre mal mais je ne trouve pas la syntaxe pour le faire.
Si quelqu'un connaisait une syntaxe avec simple xml ou autre pour faire cela sa m'aiderait bien.
Voila mon code xml:
Code :
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<dsml:dsml xmlns:dsml="xmlns:dsml=http://www.dsml.org/DSML">
  <dsml:directory-entries>
    <dsml:entry dn="uid=000315, ou=Agents, o=AG10G, c=fr">
      <dsml:objectclass>
        <dsml:oc-value>inetOrgPerson</dsml:oc-value>
        <dsml:oc-value>organizationPerson</dsml:oc-value>
        <dsml:oc-value>person</dsml:oc-value>
        <dsml:oc-value>Agent</dsml:oc-value>
        <dsml:oc-value>top</dsml:oc-value>
      </dsml:objectclass>
      <dsml:attr name="codhop">
        <dsml:value>081</dsml:value>
      </dsml:attr>
      <dsml:attr name="coddif">
        <dsml:value>10</dsml:value>
      </dsml:attr>
      <dsml:attr name="matricule">
        <dsml:value>000315</dsml:value>
      </dsml:attr>
      <dsml:attr name="entree">
        <dsml:value>2006-10-01</dsml:value>
      </dsml:attr>
      <dsml:attr name="civilite">
        <dsml:value>Mademoiselle</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomUsuel">
        <dsml:value>NOM2-000313</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomPatronymique">
	    <dsml:value>NOJF2-000313</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomMarital">
        <dsml:value>NOMM2-000313</dsml:value>
      </dsml:attr>
      <dsml:attr name="prenom">
        <dsml:value>PRENOM2-000313</dsml:value>
      </dsml:attr>
	</dsml:entry>
	   <dsml:entry dn="uid=000325, ou=Agents, o=AG10G, c=fr">
      <dsml:objectclass>
        <dsml:oc-value>inetOrgPerson</dsml:oc-value>
        <dsml:oc-value>organizationPerson</dsml:oc-value>
        <dsml:oc-value>person</dsml:oc-value>
        <dsml:oc-value>Agent</dsml:oc-value>
        <dsml:oc-value>top</dsml:oc-value>
      </dsml:objectclass>
      <dsml:attr name="codhop">
        <dsml:value>081</dsml:value>
      </dsml:attr>
      <dsml:attr name="coddif">
        <dsml:value>10</dsml:value>
      </dsml:attr>
      <dsml:attr name="matricule">
        <dsml:value>000325</dsml:value>
      </dsml:attr>
      <dsml:attr name="entree">
        <dsml:value>2006-10-11</dsml:value>
      </dsml:attr>
      <dsml:attr name="civilite">
        <dsml:value>Mademoiselle</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomUsuel">
        <dsml:value>NOM2-000313</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomPatronymique">
	    <dsml:value>NOJF2-000113</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomMarital">
        <dsml:value>NOMM2-00111</dsml:value>
      </dsml:attr>
      <dsml:attr name="prenom">
        <dsml:value>PRENOM5-000313</dsml:value>
      </dsml:attr>
	   </dsml:entry>
	   <dsml:entry dn="uid=000355, ou=Agents, o=AG10G, c=fr">
      <dsml:objectclass>
        <dsml:oc-value>inetOrgPerson</dsml:oc-value>
        <dsml:oc-value>organizationPerson</dsml:oc-value>
        <dsml:oc-value>person</dsml:oc-value>
        <dsml:oc-value>Agent</dsml:oc-value>
        <dsml:oc-value>top</dsml:oc-value>
      </dsml:objectclass>
      <dsml:attr name="codhop">
        <dsml:value>081</dsml:value>
      </dsml:attr>
      <dsml:attr name="coddif">
        <dsml:value>10</dsml:value>
      </dsml:attr>
      <dsml:attr name="matricule">
        <dsml:value>000355</dsml:value>
      </dsml:attr>
      <dsml:attr name="entree">
        <dsml:value>2006-10-21</dsml:value>
      </dsml:attr>
      <dsml:attr name="civilite">
        <dsml:value>Mademoiselle</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomUsuel">
        <dsml:value>NOM2</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomPatronymique">
	    <dsml:value>NOJF2-</dsml:value>
      </dsml:attr>
      <dsml:attr name="nomMarital">
        <dsml:value>NOMM2-3</dsml:value>
      </dsml:attr>
      <dsml:attr name="prenom">
        <dsml:value>PRENOM2-0013</dsml:value>
      </dsml:attr>
	   </dsml:entry>
        </dsml:directory-entries>
</dsml:dsml>
Je cherche ici a compter le nombre de fois ou apparait <dsml:attr name="matricule">
tous les test que j'ai fait me retourne 0 ou 1 alors que je devrait avoir 3 en resultat:s
Krabbos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 11h19   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Avec DOMDocument ça marche comme sur des roulettes:
Code :
1
2
3
4
5
6
7
8
$doc = new DOMDocument();
$doc->loadXML($xml);
 
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('dsml', 'http://www.dsml.org/DSML');
$node_list = $xpath->query('//dsml:attr[@name="matricule"]');
 
var_dump($node_list->length);
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 07/06/2011, 11h26   #3
Invité régulier
 
Homme Pierre
Étudiant
Inscription : mai 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : mai 2011
Messages : 15
Points : 5
Points : 5
merci de ta reponse je vais tester sa la probleme c'est que j'ai deja fait tout mon code en simple xml.Donc si jamais quelqun a la solution avec simple xml sa m'aiderait bien
Krabbos est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 07/06/2011, 11h35   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Sans vouloir la ramener, tu aurais quand même pu adapter mon bout de code en regardant la doc de simple XML.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/06/2011, 12h03   #5
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2010
Messages : 76
Points : 161
Points : 161
Bonjour,

Benjamin vous a donné une solution simple, efficace et facilement adaptable.

Pour SimpleXML, la solution sera tout aussi simple si, comme il vous le préconise, vous lisez bien la documentation.

Votre solution passera par :
1 - requête xpath pour ramener tous les enregistrements correspondant à vos critères
Code :
1
2
 
$r = $xml->xpath('//dsml:attr[@name="matricule"]');
2 - compter le nombre de résultats ramenés
A noter qu'une recherche sur google avec les termes "xpath count simplexml", ainsi que la doc php (http://www.php.net/manual/en/simplexmlelement.xpath.php) sur la méthode xpath de SimpleXMLElement (dans les commentaires notamment) vous aurait tout de suite donné la réponse à votre question.

Cdt.
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/06/2011, 12h06   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 466
Points : 8 466
c'est dommage parce que avec DOmXpath y'a la fonction evaluate, qui te retournerai directe la valeur

Code :
$xpath->evaluate('count(//dsml:attr[@name="matricule"])');
tu peux utilise DOMXpath avec SimpleXML grace a dom_import_simplexml
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/06/2011, 12h14   #7
Invité régulier
 
Homme Pierre
Étudiant
Inscription : mai 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : mai 2011
Messages : 15
Points : 5
Points : 5
Merci a vous j'ai pu ressoudre mon probleme j'ai ete voir la doc donnée par Benjamin Delespierre sur simple xml et traduit son code et s marche merci a vous
Krabbos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 12h20   #8
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2010
Messages : 76
Points : 161
Points : 161
Citation:
Envoyé par stealth35 Voir le message
c'est dommage parce que avec DOmXpath y'a la fonction evaluate, qui te retournerai directe la valeur

Code :
$xpath->evaluate('count(//dsml:attr[@name="matricule"])');
tu peux utilise DOMXpath avec SimpleXML grace a dom_import_simplexml
Effectivement.

A noter aussi que la fonction count utilisée de cette manière ne fonctionne pas avec SimpleXML, ou de façon sporadique (et donc non portable) en fonction de la librairie sous-jacente à SimpleXML. Elle fonctionnera, par contre, dans des expressions conditionnelles comme :
Code :
1
2
$r = $xml->xpath('//noeud[count(noeud_enfant)>1]');
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h25.


 
 
 
 
Partenaires

Hébergement Web