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 fixhier Xml a partir Url


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut Parser fixhier Xml a partir Url
    Bonjour a tous

    j'essaie de parser ce fichier xml:

    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
    <eSummaryResult>
    <DocSum>
    	<Id>23550686</Id>
    		  <Item Name="PubDate" Type="Date">2013 Apr 4</Item> Año mes dia
    		  <Item Name="EPubDate" Type="Date"/>
    		  <Item Name="Source" Type="String">N Engl J Med</Item>
    		  <Item Name="AuthorList" Type="List">
    		  <Item Name="Author" Type="String">Zehetner C</Item>
    		  <Item Name="Author" Type="String">Bechrakis N</Item>
    		</Item>
    		  <Item Name="LastAuthor" Type="String">Bechrakis N</Item>
    		  <Item Name="Title" Type="String">Images in clinical medicine. Stellate cataract.</Item> Título del artículo
    		  <Item Name="Volume" Type="String">368</Item> Volumen
    		  <Item Name="Issue" Type="String">14</Item> Fascículo de la revista
    		  <Item Name="Pages" Type="String">e18</Item> Páginas Inicio y final  (creo que e=end)
    		  <Item Name="LangList" Type="List">
    		  <Item Name="Lang" Type="String">English</Item>
    		</Item>
    		  <Item Name="NlmUniqueID" Type="String">0255562</Item>
    		  <Item Name="ISSN" Type="String">0028-4793</Item>
    		  <Item Name="ESSN" Type="String">1533-4406</Item>
    		  <Item Name="PubTypeList" Type="List">
    		  <Item Name="PubType" Type="String">Journal Article</Item>
    		</Item>
    </DocSum>
    </eSummaryResult>

    Avec ce code PHP

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
     
    $xml = simplexml_load_file($url);
     
    foreach($xml->result->DocSum->row as $key=>$row){
        foreach($row->Item as $key => $value){
            echo $value['Name']." => ";
            echo $value."<br />";
        }
    }
     
    ?>

    Rien ne s'affiche a l'ecran, je ne suis pas sur que le code soit le correcte, quelqu'un connais la façon de recuperer des données?
    Si oui, pourriez-vous poster un exemple?

    Cecie est la sortie de print_r($xml)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SimpleXMLElement Object ( [DocSum] => SimpleXMLElement Object ( [Id] => 23565222 [Item] => Array ( [0] => 2013 [1] => 2013 Apr 2 [2] => PLoS One [3] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => AuthorList [Type] => List ) [Item] => Array ( [0] => Lalremruata A [1] => Ball M [2] => Bianucci R [3] => Welte B [4] => Nerlich AG [5] => Kun JF [6] => Pusch CM ) ) [4] => Pusch CM [5] => Molecular identification of falciparum malaria and human tuberculosis co-infections in mummies from the fayum depression (lower egypt). [6] => 8 [7] => 4 [8] => e60307 [9] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => LangList [Type] => List ) [Item] => English ) [10] => 101285081 [11] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => ISSN [Type] => String ) ) [12] => 1932-6203 [13] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => PubTypeList [Type] => List ) [Item] => Journal Article ) [14] => PubMed - in process [15] => ppublish+epublish [16] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => ArticleIds [Type] => List ) [Item] => Array ( [0] => 10.1371/journal.pone.0060307 [1] => PONE-D-12-39756 [2] => 23565222 [3] => PMC3614933 [4] => 23565222 [5] => 23565222 [6] => pmc-id: PMC3614933; ) ) [17] => 10.1371/journal.pone.0060307 [18] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => History [Type] => List ) [Item] => Array ( [0] => 2012/12/16 00:00 [1] => 2013/02/25 00:00 [2] => 2013/04/02 00:00 [3] => 2013/04/09 06:00 [4] => 2013/04/09 06:00 [5] => 2013/04/09 06:00 ) ) [19] => SimpleXMLElement Object ( [@attributes] => Array ( [Name] => References [Type] => List ) ) [20] => 1 [21] => 0 [22] => PloS one [23] => doi: 10.1371/journal.pone.0060307 [24] => 2013;8(4):e60307 ) ) )
    D'avance merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Par défaut
    je verrai plutot un truc comme (à adapter) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $dom = new DOMDocument("1.0");
    $var1= $dom->getElementsByTagName('Item');
    et un foreach
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $i = 0;
    foreach ($var1 as $ver) {
    	if ($i == 0)
    		echo $ver->nodeValue, PHP_EOL;
    	$i++;
    }

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonjour

    merci pour ta reponse, j'ai ce nouveau code:

    Code php : 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
    <?php
     
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
     
    $xml = simplexml_load_file($url);
     
    $dom = new DOMDocument("1.0");
    $var1= $dom->getElementsByTagName('Item');
     
    $i = 0;
    		foreach ($var1 as $ver) {
    			if ($i == 0)
    				echo $ver->nodeValue, PHP_EOL;
    			$i++;
    		}
    ?>

    Et le resultat est: page blanche.
    Je dois laisser ma variable $xml qui recupere le fichier de la url?
    D'avance merci

  4. #4
    Membre expérimenté
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Par défaut
    ha oui, non mais dans la variable $dom par exemple je récupère un fichier (ici local)

    il faut que tu l'adapte pour l'url

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Donc dans mon cas je fais:

    $dom->load($xml);

    n'est ce pas?
    je vais essayé comme ceci:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
    $xml = simplexml_load_file($url);
     
    $dom->load($xml);
    $var1= $dom->getElementsByTagName('Item');
     
    $i = 0;
    		foreach ($var1 as $ver) {
    			if ($i == 0)
    				echo $ver->nodeValue, PHP_EOL;
    			$i++;
    		}
    ?>

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Ufff ça marche pas,
    la page done une erreur.

  7. #7
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Faites attention aux chaînes de références aux enfants éléments.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
     
    $xml = simplexml_load_file($url);
     
    //foreach($xml->result->DocSum->row as $key=>$row){
    foreach($xml->DocSum->Item as $key=>$row){
        foreach($row->Item as $key => $value){
            echo $value['Name']." => ";
            echo $value."<br />";
        }
    }
     
    ?>

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonjour,
    a oui la je vois les données ça marche, bien que j'ai une question.
    Regarde ceci c'est le resultat:

    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
    Author => Lalremruata A
    Author => Ball M
    Author => Bianucci R
    Author => Welte B
    Author => Nerlich AG
    Author => Kun JF
    Author => Pusch CM
    Lang => English
    PubType => Journal Article
    doi => 10.1371/journal.pone.0060307
    pii => PONE-D-12-39756
    pubmed => 23565222
    pmc => PMC3614933
    eid => 23565222
    rid => 23565222
    pmcid => pmc-id: PMC3614933;
    received => 2012/12/16 00:00
    accepted => 2013/02/25 00:00
    epublish => 2013/04/02 00:00
    entrez => 2013/04/09 06:00
    pubmed => 2013/04/09 06:00
    medline => 2013/04/09 06:00
    et ceci est le XML
    Tu vois apres l'auteur PUSH CM nous avons LANG
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Item Name="LastAuthor" Type="String">Pusch CM</Item>
    <Item Name="Title" Type="String">
    Molecular identification of falciparum malaria and human tuberculosis co-infections in mummies from the fayum depression (lower egypt).
    </Item>
    <Item Name="Volume" Type="String">8</Item>
    <Item Name="Issue" Type="String">4</Item>
    <Item Name="Pages" Type="String">e60307</Item>
    <Item Name="LangList" Type="List">
    <Item Name="Lang" Type="String">English</Item>
    mais dans le fichier il y a des champs entre qui ne sortent pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <Item Name="Title" Type="String">
    Molecular identification of falciparum malaria and human tuberculosis co-infections in mummies from the fayum depression (lower egypt).
    </Item>
    <Item Name="Volume" Type="String">8</Item>
    <Item Name="Issue" Type="String">4</Item>
    <Item Name="Pages" Type="String">e60307</Item>
    <Item Name="LangList" Type="List">
    C'est a cause du </Item> ? Comment puis je faire pour tout sortir?
    D'avance merci

  9. #9
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Oui et c'est normal. Il ne s'agit vraiment pas d'Items du même niveau. Si vous voulez tous les 'Item', vous pouvez faire ça et je prends un peu de soins pour mettre au clair les niveaux parent-enfant par une indentation.
    Code php : 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
    <?php
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
    $xml = simplexml_load_file($url);
     
    foreach($xml->DocSum as $key=>$row) {
        foreach($row->Item as $k=>$v) {
            echo $v['Name'];
            if (count($v->children())==0) {
                echo '=>',$v;
            }
            echo "\n";
            if (count($v->children())!=0) {
                foreach($v->Item as $kk=>$vv) {
                    echo "\t",$vv['Name'],'=>',$vv,"\n";
                }
            }
        }
    }
     
    ?>

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Whaaa genial, la oui je vois toutes les données.
    Alors maintenant si je souhaite creer une table html avec ceci, je dois utiliser les 2 arrays n'est ce pas?


    Comme t'as pu le constater j'y connais pas grand chose en php, mais je vais essayer de comprendre:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
    $xml = simplexml_load_file($url);
    La je place le contenu du XML dans la variable $xml

    Ensuite je vois 3 foreach ce qui veut dire qu'il y a 3 niveau dans le XML?
    DocSum c'est le niveau le plus haut.
    Et ensuite children()==0 ça sert a filtrer si Item possede un sous champs?

    Bufff que c'est compliqué non?

    Imagine que de tous ces champs je souhaite la date:
    le titre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pusch CM Title=>Molecular identification of falciparum malaria and human tuberculosis co-infections in mummies from the fayum depression (lower egypt).
    Le volume
    et les issues
    je devrais utiliser $v['Name']
    et $vv['Name']
    ?


    Code php : 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
    <?php
    foreach($xml->DocSum as $key=>$row) {
        foreach($row->Item as $k=>$v) {
            echo $v['Name'];
            if (count($v->children())==0) {
                echo '=>',$v;
            }
            echo "\n";
            if (count($v->children())!=0) {
                foreach($v->Item as $kk=>$vv) {
                    echo "\t",$vv['Name'],'=>',$vv,"\n";
                }
            }
        }
    }
     
    ?>

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Bonsoir,
    voila ce que donne le nouveau code, melangé avec un peu de hrml:

    Code php : 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
    <?php
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
    $xml = simplexml_load_file($url);
     
    echo"
    <html>
    <table border='1'>
            <tr>";
    foreach($xml->DocSum as $key=>$row) {
        foreach($row->Item as $k=>$v) {
            echo "<td>".$v['Name']."</td>";
            if (count($v->children())==0) {
                echo "<td>$v</td></tr>";
            }
            echo "\n";
            if (count($v->children())!=0) {
                foreach($v->Item as $kk=>$vv) {
                    echo "\t",$vv['Name'],'=>',$vv,"\n";
                }
            }
        }
    }
    echo "  </tr>
    </table>";
     
    ?>

    et le resultat:
    tu peux le voir si tu clic ici:
    http://opac.orex.es/admin_orex/xml.php

    Tout ce qu'il me manque maintenant c'est pouvoir pointer sur un champs en particulier , par exemple, date, auteur, titre, volume et pages.

    Et je devrais construir la page html avec ces valeurs.
    Le probleme c'est que si je fais un foreach, ça parcours tout le array, si j'ai besoin que de quelques champs? y'a til un moyen de sortir quelques données sans foreach?

    D'avance merci

  12. #12
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Si vous prenez la page comme une application web, ne faut-il pas faire une stylisation plus consistante pour la plaisir de preneurs? Je la re-fais un peu dans cette direction.

    Tout ce qu'il me manque maintenant c'est pouvoir pointer sur un champs en particulier , par exemple, date, auteur, titre, volume et pages.

    Et je devrais construir la page html avec ces valeurs.
    Le probleme c'est que si je fais un foreach, ça parcours tout le array, si j'ai besoin que de quelques champs? y'a til un moyen de sortir quelques données sans foreach?
    SimpleXML supporte des notions de xpath avec une portée pratique mais pas tout l'ampleur de cette téchnologies. Je démontre comment faire pour les auteurs au bas de la page. Pour les autres, on peut faire pareils. Mais, si vous ne savez rien de xpath, vous devrez le apprendre. Je ne peux pas détailler tous et il n'y a pas de chemin courte de faire ce genre de choses correctemen.
    Code php : 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
    <?php
    $url = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=23565222";
    $xml = simplexml_load_file($url);
     
    echo" <html><body><table border='1'>";
    foreach($xml->DocSum as $key=>$row) {
        foreach($row->Item as $k=>$v) {
            echo "<tr>";
            echo "<td>".$v['Name']."&nbsp;</td>";
            if (count($v->children())==0) {
                echo "<td>",$v,"&nbsp;</td></tr>";
            } else {
                echo "<td>---&nbsp;</td>";
            }
            echo "</tr>";
            if (count($v->children())!=0) {
                foreach($v->Item as $kk=>$vv) {
                    echo "<tr>";
                    echo "<td style='color:blue'>",$vv['Name'],"&nbsp;</td>";
                    echo "<td style='color:blue'>",$vv,"&nbsp;</td>";
                    echo "</tr>";
                }
            }
        }
    }
    echo "</table>";
     
    $authors=$xml->xpath("//Item[@Name='Author']/text()");
    echo "<div>authors:<br />";
    foreach ($authors as $author) {
        echo "<div>", str_repeat("&nbsp;",4),'-',$author,"</div>";
    }
    echo "</div>";
     
    echo "</body></html>";
     
    ?>

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut
    Genial,
    je vais faire l'adaptation ce soir et normalement avec ce nouveau code je devrait m'en sortir, merci beaucoup de ton aide !!
    Si t'as besoin de conseils avec Oracle n'hesite pas.
    Cordialement

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

Discussions similaires

  1. copier un document XML a partir de l'URL
    Par am@123 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/06/2009, 13h20
  2. [DOM4J] Parser un document xml a partir d'un chemin
    Par tiph02 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 15/01/2009, 11h46
  3. Réponses: 4
    Dernier message: 30/05/2007, 10h50
  4. loader un fichier xml a partir du URL
    Par joecool2005 dans le forum ASP
    Réponses: 1
    Dernier message: 21/11/2006, 22h24
  5. Réponses: 2
    Dernier message: 29/07/2003, 12h52

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