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

Bibliothèques et frameworks PHP Discussion :

[DOM] Comment travailler avec un xml dont les noms de noeud sont identique ?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut [DOM] Comment travailler avec un xml dont les noms de noeud sont identique ?
    Bonjour à tous,

    J'ai une difficulté avec un traitement de données xml.
    Je récupère sur un serveur distant (une API) des données au format xml, j'utilise DOM pour le traitement de celui-ci. En fait le Webservice renvoie une chaîne de caractère avec tout à l'intérieur. J'utilise donc loadXML pour tout récupérer.

    Mon problème est que je n'ai pas la main sur ce xml et sur la façon dont il est créé.

    le format du xml ressemble à ça :
    Code xml : 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
    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
    <tree path="">
    	<item  id="test"  name="test"  isFolder="true"  isLibrary="true"  path="test" >
    		<item  id="iddoc1"  name="doc1"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blabla"  path="test\doc1.xml" >
    			<fileInfo fileIndexed="2012-09-14 16:03:19" numPages="2" resolution="72" width="155.903" height="240.941" fileSize="103.48 Kb">
    				<metaData>
    					<item name="Num. Pages" value="2" />
    					<item name="Width" value="55 mm" />
    					<item name="Height" value="85 mm" />
    				</metaData>
    				<boxes />
    			</fileInfo>
    		</item>
    		<item  id="iddoc2"  name="doc2"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blabla2"  path="test\doc2.xml" >
    			<fileInfo fileIndexed="2012-09-07 10:38:47" numPages="2" resolution="72" width="155.903" height="240.941" fileSize="103.45 Kb">
    				<metaData>
    					<item name="Num. Pages" value="2" />
    					<item name="Width" value="55 mm" />
    					<item name="Height" value="85 mm" />
    				</metaData>
    				<boxes />
    			</fileInfo>
    		</item>
    	</item>
     
    	<item  id="test2"  name="test2"  isFolder="true"  isLibrary="true"  path="test2" >
    		<item  id="test2\demodocuments"  name="demodocuments"  isFolder="true"  isLibrary="false"  path="test2\demodocuments" >
     
    			<item  id="test2\demodocuments\BC"  name="BC"  isFolder="true"  isLibrary="false"  path="test2\demodocuments\BC" >
    				<item  id="idBC"  name="BCV"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL=""  path="test2\demodocuments\BC\BCV.xml" >
    					<fileInfo fileIndexed="2012-09-18 16:27:59" numPages="1" resolution="72" width="155.903" height="240.941" fileSize="18.13 Kb">
    						<metaData><item name="Num. Pages" value="1" />
    							<item name="Width" value="55mm" />
    							<item name="Height" value="85mm" />	
    						</metaData>
    						<boxes />
    					</fileInfo>
    				</item>
    				<item  id="idBC_DataSource"  name="BC_DataSource"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blablaBC_DataSource"  path="test2\demodocuments\BC\BC_DataSource.xml" >
    					<fileInfo fileIndexed="2012-09-14 16:11:27" numPages="2" resolution="72" width="155.903" height="240.941" fileSize="103.45 Kb">
    						<metaData>
    							<item name="Num. Pages" value="2" />
    							<item name="Width" value="55 mm" />
    							<item name="Height" value="85 mm" />
    						</metaData>
    						<boxes />
    					</fileInfo>
    				</item>
    			</item>
     
    			<item  id="test2\demodocuments\CC"  name="CC"  isFolder="true"  isLibrary="false"  path="test2\demodocuments\CC" >
    				<item  id="test2\demodocuments\CC\Snippets"  name="Snippets"  isFolder="true"  isLibrary="false"  path="test2\demodocuments\CC\Snippets" >
    					<item  id="idKV-demo"  name="KV-demo"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blablaKV-demo"  path="test2\demodocuments\CC\Snippets\KV-demo.xml" >
    						<fileInfo fileIndexed="2012-10-01 16:51:36" numPages="1" resolution="72" width="425.19" height="283.46" fileSize="59.97 Kb">
    							<metaData>
    								<item name="Num. Pages" value="1" />
    								<item name="Width" value="150 mm" />
    								<item name="Height" value="100 mm" />
    							</metaData>
    							<boxes />
    						</fileInfo>
    					</item>
    					<item  id="idKV"  name="KV"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blablaKV"  path="test2\demodocuments\CC\Snippets\KV.xml" >
    						<fileInfo fileIndexed="2012-10-01 16:51:36" numPages="1" resolution="72" width="425.19" height="283.46" fileSize="103.89 Kb">
    							<metaData>
    								<item name="Num. Pages" value="1" />
    								<item name="Width" value="150 mm" />
    								<item name="Height" value="100 mm" />
    							</metaData>
    							<boxes />
    						</fileInfo>
    					</item>
    				</item>
    				<item  id="idCCd"  name="CCd"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blablaCCd"  path="test2\demodocuments\CC\CCd.xml" >
    					<fileInfo fileIndexed="2012-04-19 17:34:08" numPages="1" resolution="72" width="425.19" height="283.46" fileSize="137.46 Kb">
    						<metaData>
    							<item name="Num. Pages" value="1" />
    							<item name="Width" value="150 mm" />
    							<item name="Height" value="100 mm" />
    						</metaData>
    						<boxes />
    					</fileInfo>
    				</item>
    			</item>
     
    			<item  id="idtoto"  name="toto"  isFolder="false"  isLibrary="false"  hasPreviewErrors="false"  iconURL="blablatoto"  path="test2\demodocuments\toto.xml" >
    				<fileInfo fileIndexed="2012-10-01 16:51:36" numPages="1" resolution="72" width="425.19" height="283.46" fileSize="59.97 Kb">
    					<metaData>
    						<item name="Num. Pages" value="1" />
    						<item name="Width" value="150 mm" />
    						<item name="Height" value="100 mm" />
    					</metaData>
    					<boxes />
    				</fileInfo>
    			</item>
    		</item>
    	</item>
    </tree>

    et là comme vous pouvez le voir la grande majorité des noeuds on le même nom

    Je voudrais traiter ce xml, pour en faire une liste du type :

    -test
    - document doc1 (avec nom et photo)
    - document doc2 (avec nom et photo)
    -test 2
    -demodocuments
    -BC
    - document BCV (avec nom et photo)
    - document BC_DataSource (avec nom et photo)
    -CC
    -Snippets
    - document KV-demo (avec nom et photo)
    - document KV (avec nom et photo)
    - document CCd (avec nom et photo)
    - document toto (avec nom et photo)

    Mais je n'arrive pas à faire ça, je m’emmêle les pinceaux dans les boucle les if et autre. N'y a t-il pas un moyen efficace de mettre par exemple tout dans des tableau ?
    Là j'approche la surchauffe cérébrale lol

    Comment prendre seulement l' <item> de premier niveau et après naviguer dans celui-ci ?

    J'avais au début commencé à utiliser ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($pays->getAttribute("isFolder") == "true" && $pays->getAttribute("isLibrary") == "true")
    Donc là je suis dans la cas d'un des dossiers "mère" (test ou test2 ). Mais après comment repartir dans le contenu de test ?

    Merci à ceux qui prendront le temps de me lire mais surtout à ceux qui essayeront (et y arriveront) de m'aider ^^

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Avec DOMXPath par exemple.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci de ta réponse, mais je ne comprend pas comment je peux utiliser DOMXPath.

    Je suis désolée je n'ai jamais utiliser de traitement xml, donc je suis perdue, surtout vu la tête des données à traiter

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Il suffit de faire une requête (DOMXPath:: query) sur //tree/item pour récupérer la collection de noeuds item du premier niveau et ensuite les manipuler individuellement.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    ok, merci de ta réponse.

    J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $doc = new DOMXPath($dom);
    	$query = '//tree/item';
     
    	$entries = $doc->query($query);
     
    	foreach ($entries as $entry) {
    		echo "";
    	}
    Je n'ai pas compris comment appeler les élément dans le écho. Dans l'exemple ils utilisent : {$entry->previousSibling->previousSibling->nodeValue}, mais je ne comprend pas à quoi cela fait référence. Je ne comprend pas pourquoi ils utilise plusieurs fois previousSibling.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Points : 30
    Points
    30
    Par défaut
    Bonjour, pour appeler dans l'echo, tu dois demander a dom ce que tu veux récuperer.

    Genre dans /tree/item tu veux avoir l'id et isLibrary

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($entries as $entry) {
        printf("item id: %s Library %s<br />", $entry->getAttribute('id'),  $entry->getAttribute('isLibrary'));
    }
    Après tu peux parcourir les enfant d'item, dom->childNodes.

Discussions similaires

  1. [Batch] compter les fichiers dont les 5 premières lettres sont identiques
    Par jomel0609 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 10/01/2013, 12h11
  2. Réponses: 4
    Dernier message: 02/10/2012, 14h20
  3. Réponses: 4
    Dernier message: 02/05/2009, 17h56
  4. Créer une table dont les noms de colonnes sont des paramètres
    Par Mythrandil dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2007, 15h08
  5. Réponses: 2
    Dernier message: 22/06/2006, 11h03

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