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

XSL/XSLT/XPATH XML Discussion :

parser le contenu de deux fichiers XML


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Février 2012
    Messages : 110
    Par défaut parser le contenu de deux fichiers XML
    Bonjour,
    J'ai un gros problème 'a résoudre et j'aimerais etre sure de me lancer dans la bonne voie.

    J'ai deux fichiers xml.
    Le premier d'entre eux se presente 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
    <balise0>
    	<balise1>
    		<balise2>
    			<balise3>opopop</balise3>
    			<balise3>gnagnagna</balise3>
    		</balise2>
    		<balise4>
    			<balise1>blablabla</balise1>
    			<balise5>didadidadou</balise5>
    		</balise4>
    		<balise6>
    			<balise7>
    				<balise1>pfioupioupiou</balise1>
    			</balise7>
    		</balise6>
    	</balise1>
    </balise0>
    Il y a une quantite astronomique de balises differentes, en fait elles ne sont que tres peu repetees dans le document pour la bonne raison qu'une balise est en fait une information.
    En fait, chaque balise a un "type", elle est soit un segment, soit un groupe, soit un composite, soit une data, et le document est forme 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
    <groupe>
    	<groupe>
    		<segment>
    			<data>opopop</data>
    			<data>gnagnagna</data>
    		</segment>
    		<segment>
    			<data>blablabla</data>
    			<data>didadidadou</data>
    		</segment>
    		<segment>
    			<composite>
    				<data>pfioupioupiou</data>
    			</composite>
    		</segment>
    	</groupe>
    </groupe>
    (c'est le m^eme document que le premier exemple)

    On a donc toujours la meme structure:
    (n)groupe -> 1 segment -> (n)composite -> 1 data.

    Je dois trouver une maniere de representer cette information, je dois pour cela savoir pour chaque balise si c'est un segment, un composite, un groupe.

    Je sais cela grace au 2eme document XML qui se presente 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <GROUPS>
    	<GROUP ID="532421" SMARTNAME="balise1"  DESCRIPTI... infos diverses concernant la balise, qu'il va falloir integrer dans le HTML final>
    		<SEGMENTREF ID="52452" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    		<GROUP ID="676144" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    			<SEGMENTREF ID="5445" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    		</GROUP>
    	</GROUP>
    </GROUPS>
    <SEGMENTS>
    	<SEGMENT ID="241254" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    		<COMPOSITEREF ID="25454" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    		<DATA ID="245005" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    			<CODESETS>
    				<CODESET TAG="pfioupioupiou" DESCRIPTION="explication de la valeur de la data"/>
    				<CODESET TAG="blablabla" DESCRIPTION="explication de la valeur de la data"/>
    				<CODESET TAG="opopop" DESCRIPTION="explication de la valeur de la data"/>
    			</CODESETS>
    		</DATA>
    	</SEGMENT>
    </SEGMENTS>
    <COMPOSITES>
    	<COMPOSITE ID="8637" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    		<DATA ID="23574254" SMARTNAME="balise1"  DESCRIPTI... infos diverses qu'il va falloir integrer dans le HTML final>
    		<CODESETS>
    			<CODESET TAG="didadidadou" DESCRIPTION="explication de la valeur de la data"/>
    		</CODESETS>
    		</DATA>
    </COMPOSITES>
    Ce document nous dit:
    - de quel "type" est chaque balise du document 1 (la balise correspond au type de la balise du document 1, smartname correspond au nom de la balise du document 1)
    - les informations correspondantes aux noms des balises
    - la traduction des valeurs ("pfioupioupiou", "opopop", "gnagnagna"... cette traduction est contenue dans CODSET)


    Voila, en gros, mon travail. Il va donc falloir que je combine les deux documents. Le rendu sera une page HTML avec la m^eme structure que le premier document, et avec les informations contenues dans le deuxieme document.
    Je pensais donc mettre les informations du document 2 dans un tableau ou on aurait:
    nom de la balise | type de balise | description
    Puis dans un second temps integrer cela 'a la presentation HTML faite grace 'a XSLT.

    En fait une fois que j'aurai le tableau "nom de la balise | type de balise | description" je pourrai peut etre parser le contenu du document 1 pour obtenir par exemple:

    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
    <groupe VALUE="balise0" DESCRIPTION= ...........>
    	<groupe VALUE="balise1" DESCRIPTION= ...........>
    		<segment VALUE="balise2" DESCRIPTION= ...........>
    			<data VALUE="balise3" DESCRIPTION= ...........>opopop</data>
    			<data VALUE="balise3" DESCRIPTION= ...........>gnagnagna</data>
    		</segment>
    		<segment>
    			<data VALUE="balise1" DESCRIPTION= ...........>blablabla</data>
    			<data VALUE="balise5" DESCRIPTION= ...........>didadidadou</data>
    		</segment>
    		<segment>
    			<composite VALUE="balise7" DESCRIPTION= ...........>
    				<data VALUE="balise1" DESCRIPTION= ...........>pfioupioupiou</data>
    			</composite>
    		</segment>
    	</groupe>
    </groupe>
    Ce qui sera plus facile 'a presenter en HTML


    Cela (la recuperation du contenu du document2 dans un tableau) est faisable avec DOM par exemple, n'est ce pas? Ou simpleXML, sans doute plus simple... Est ce que vous me conseillez une technologie particuliere? Est ce que ma maniere de proceder vous semble correcte?
    (ne connaissant pas encore grand chose de tout cela, meme si je me renseigne depuis une semaine, je fais appel 'a des experts!)
    J'espere que vous aurez 'a peu pres compris mon probleme,

    Un enorme merci d'avance!

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Février 2012
    Messages : 110
    Par défaut
    Je vais donc poser une question un peu plus breve.

    Si je me retrouve avec d'un cote la structure
    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
    <balise0>
    	<balise1>
    		<balise2>
    			<balise3>opopop</balise3>
    			<balise3>gnagnagna</balise3>
    		</balise2>
    		<balise4>
    			<balise1>blablabla</balise1>
    			<balise5>didadidadou</balise5>
    		</balise4>
    		<balise6>
    			<balise7>
    				<balise1>pfioupioupiou</balise1>
    			</balise7>
    		</balise6>
    	</balise1>
    </balise0>
    et de l'autre un tableau obtenu grace 'a simpleXML, contenant
    balise1 | groupe| description | etc...
    balise2 | segment| description | etc
    balise3 | data| description | etc
    balise4 | composite| description | etc
    et que je veux que le premier document se transforme en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <groupe value = "balise0" description = "blablabla">
    	<groupe value = "balise1" description = "blablabla">
    		<segment value = "balise2" description = "blablabla">
    			<data value = "balise3" description = "blablabla">opopop</balise3>
    etc...


    est ce que je peux faire ca grace 'a DOM en PHP? Est ce que ca vous parait etre une bonne solution?

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Je ne connais pas du tout la gestion du XML en PHP et malheureusement, ceux qui connaissent vont rarement dans le forum XML.

    Par contre, ce que tu veux faire (si j'ai bien tout compris ) est totalement faisable en XSLT.

    Pour celà, il faut que tes fichiers XML existent réellement (que ce ne soient pas juste des flux) et que tu utilises la fonction XSL document() pour les charger (en tout cas au moins un des deux).

    Une fois que tu as accès aux 2 documents dans la même feuille de style, faire le mapping est relativement simple.

    Je te propose que tu nous montres comment tu penses coder ça, que tu nous dises où ça plante (si ça plante) et qu'on t'aide à l'améliorer/corriger si besoin.
    Ca c'est si tu penses faire tout le traitement en XSLT.

    Par contre si tu comptes faire un traitement en PHP, je te conseille de demander sur le forum PHP dédié à ça.

  4. #4
    Membre Expert
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Par défaut
    Bonjour,

    c'est clairement faisable avec XSLT
    Dans tous les cas, ton idée de tableau n'est pas du tout utile
    et ne fait que complexifier ton programme.

    Il te faut commencer par renommer tes éléments à partir de l'attribut value.
    Puis effectuer ta transformation données vers html.
    Dans un soucis de simplicité, tu peux commencer par écrire ces deux étapes dans des fichiers différents.

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Février 2012
    Messages : 110
    Par défaut
    Merci beaucoup. En fait je ne suis pas du tout 'a l'aise avec XSLT, ça m'est totalement inconnu et je patauge dans la semoule depuis une semaine, je n'avance 'a rien.
    Mais je vais essayer de suivre votre conseil, et donc commencer par le renommage. Par contre je pense que vous n'en avez pas fini avec mes questions

  6. #6
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Février 2012
    Messages : 110
    Par défaut
    Comme prévu je galère pas mal!

    Voila ce que j'aimerais faire: comme si j'avais 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
    18
    19
    20
    21
    <groupe VALUE="balise0" DESCRIPTION= "trgbcxv">
    	<groupe VALUE="balise1" DESCRIPTION= "hfxb">
    		<segment VALUE="balise2" DESCRIPTION="grbv">
    			<data VALUE="balise3" DESCRIPTION= "breb">opopop</data>
    			<data VALUE="balise3" DESCRIPTION= "brfb">gnagnagna</data>
    		</segment>
    		<segment>
    			<data VALUE="balise1" DESCRIPTION= "bre">blablabla</data>
    			<data VALUE="balise5" DESCRIPTION= ".thendxv">didadidadou</data>
    		</segment>
    		<segment>
    			<composite VALUE="balise7" DESCRIPTION= "tygndc">
    				<data VALUE="balise1" DESCRIPTION= "yhtf">pfioupioupiou</data>
    				<composite VALUE="balise7" DESCRIPTION= "tygndc">
    					<data VALUE="balise1" DESCRIPTION= "ymrgc">jhybgkb</data>
    				</composite>
    			</composite>
    		</segment>
    	</groupe>
     
    </groupe>
    et qu'en faisant
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output  method="html"  encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" indent="yes" />
     
    <xsl:template match="/">
    	<html><body>
    		<xsl:apply-templates/>
    	</body></html>
    </xsl:template>
     
     
    <xsl:template match="/">
    <p>OPOPOPPPPPP</p>
    <table border="1" cellspacing="0" cellpadding="3">
    		<tr bgcolor="#FFFF00">
    			<td>Data</td>
    			<td>Tag</td>
    			<td>Description</td>
    		</tr>
     
     
    <xsl:for-each select="//groupe">
    	<xsl:for-each select="segment">
    		<xsl:for-each select="data">
    			<tr>
    				<td><xsl:value-of select="."/></td>
    				<td><xsl:value-of select="@VALUE"/></td>
    				<td><xsl:value-of select="@DESCRIPTION"/></td>
    			</tr>
    		</xsl:for-each>	
    	</xsl:for-each>
     
    	<xsl:for-each select="segment//composite">
    			<xsl:for-each select="data">
    				<tr>
    					<td><xsl:value-of select="."/></td>
    					<td><xsl:value-of select="@VALUE"/></td>
    					<td><xsl:value-of select="@DESCRIPTION"/></td>
    				</tr>
    			</xsl:for-each>	
    	</xsl:for-each>
     
     
    </xsl:for-each>
    </table>
    </xsl:template>
    </xsl:stylesheet>
    j'obtienne
    Nom : exTab.jpg
Affichages : 221
Taille : 14,6 Ko

    Sauf que je n'ai pas le premier document, j'ai 'a la place les 2 que voici ensuite.
    je suis donc vos conseils et j'essaie de mapper les deux docs XML:

    la structure de
    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
    <?xml version="1.0" encoding="UTF-8" ?> 
    <balise0>
    	<balise1>
    		<balise2>
    			<balise3>opopop</balise3>
    			<balise3>gnagnagna</balise3>
    		</balise2>
    		<balise4>
    			<balise1>blablabla</balise1>
    			<balise5>didadidadou</balise5>
    		</balise4>
    		<balise6>
    			<balise7>
    				<balise8>pfioupioupiou</balise8>
    			</balise7>
    		</balise6>
    	</balise1>
    </balise0>

    avec les informations de
    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
     
    <GROUPS>
    	<GROUP ID="532421" SMARTNAME="balise1"  DESCRIPTION= "balise numero 1">
    		<SEGMENTREF ID="52452" SMARTNAME="balise2"  DESCRIPTION= "balise numero 2"/>
    		<GROUP ID="676144" SMARTNAME="balise3"  DESCRIPTION= "balise numero 3">
    			<SEGMENTREF ID="5445" SMARTNAME="balise1"  DESCRIPTION= "balise numero 1"/>
    		</GROUP>
    	</GROUP>
    </GROUPS>
    <SEGMENTS>
    	<SEGMENT ID="241254" SMARTNAME="balise4"  DESCRIPTION= "balise numero 4">
    		<COMPOSITEREF ID="25454" SMARTNAME="balise5"  DESCRIPTION= "balise numero 5"/>
    		<DATA ID="245005" SMARTNAME="balise6"  DESCRIPTION= "balise numero 6">
    			<CODESETS>
    				<CODESET TAG="pfioupioupiou" DESCRIPTION="explication de la valeur de pfioupioupiou"/>
    				<CODESET TAG="blablabla" DESCRIPTION="explication de la valeur de blablabla"/>
    				<CODESET TAG="opopop" DESCRIPTION="explication de la valeur de opopop"/>
    			</CODESETS>
    		</DATA>
    	</SEGMENT>
    </SEGMENTS>
    <COMPOSITES>
    	<COMPOSITE ID="8637" SMARTNAME="balise7"  DESCRIPTION= "balise numero 7"/>
    		<DATA ID="23574254" SMARTNAME="balise8"  DESCRIPTION= "balise numero 8">
    		<CODESETS>
    			<CODESET TAG="didadidadou" DESCRIPTION="explication de la valeur de didadidadou"/>
    		</CODESETS>
    		</DATA>
    </COMPOSITES>
    pour cela j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     	$XmlData = "newExemple.xml";
    	$XslData = "new2.xsl";
    et le xsl:
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output  method="html"  encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" indent="yes" />
     
    <xsl:template match="/">
    	<html><body>
    		<xsl:apply-templates/>
    	</body></html>
    </xsl:template>
     
    <xsl:template match="/">
    <p>OPOPOPPPPPP</p>
    <table border="1" cellspacing="0" cellpadding="3">
    		<tr bgcolor="#FFFF00">
    			<td>Data</td>
    			<td>Description</td>
    		</tr>
     
    		<xsl:variable name="nomBalise" select="local-name(.)" />
    <xsl:for-each select="document('newStruct.xml')//GROUP[@SMARTNAME=$nomBalise]">
    			<tr>
    				<td><xsl:value-of select="."/></td>
    				<td><xsl:value-of select="document('newStruct.xml')//GROUPE[@SMARTNAME=$nomBalise]/@DESCRIPTION "/></td>
    			</tr>
    </xsl:for-each>		
     
    </table>
    </xsl:template>
    </xsl:stylesheet>
    J'essaie de faire ce que j'ai explique dans mon premier post. jusqu'ici, j'aimerais simplement recuperer la description de balise1, qui est un "group".

    Mais je ne sais pas vraiment comment m'y prendre, est ce que le fond de ma méthode est bon?

    Et est ce que le fait qu'il y ait des balises "uniques" va poser probleme?

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

Discussions similaires

  1. Outils sur les différences entre deux fichiers XML
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 19
    Dernier message: 21/07/2008, 15h21
  2. [XSLT] probleme de parcourt deux fichiers xml dans xsl
    Par coucouA dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/07/2006, 20h32
  3. [JDOM] Comparer deux fichiers XML en Java
    Par calimero2611 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 30/06/2006, 11h19
  4. [XML] Convertir fichier XLS en deux fichiers XML
    Par Kornoman dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 31/03/2006, 15h30
  5. Lire le contenu d'un fichier xml
    Par Invité dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 10/01/2006, 19h13

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