Bonjour, je me permet de laisser un message ici car je dois parser puis afficher seulement certains éléments d'un fichier XML.

Etant un débutant je vous avoue que je galère pas mal...

Le fichier XML se présente sous cette forme (petit morceau choisi)

<md:EntityDescriptor entityID="URL">
            <md:Extensions>
                <mdrpi:RegistrationInfo registrationAuthority="URL" registrationInstant="2011-06-01T11:47:42Z">
                    <mdrpi:RegistrationPolicy xml:lang="en">URL</mdrpi:RegistrationPolicy>
                </mdrpi:RegistrationInfo>
            </md:Extensions>
        <md:IDPSSODescriptor protocolSupportEnumeration="urn:oa2.0:protocol">
            <md:Extensions>
                    <shibmd:Scope regexp="false">URL</shibmd:Scope
                <mdui:UIInfo>             
                  <mdui:DisplayName xml:lang="en">NAME</mdui:DisplayName>
                  <mdui:InformationURL xml:lang="fr">URL</mdui:InformationURL>
                      <mdui:DisplayName xml:lang="fr">URL</mdui:DisplayName>
                    </mdui:UIInfo>
            </md:Extensions>
                <md:KeyDescriptor use="signing">
<ds:KeyInfo>
                      <ds:X509Data>
                        <ds:X509Certificate> PDCCAiSWoL
                        </ds:X509Certificate>
                      </ds:X509Data>
                    </ds:KeyInfo>
                </md:KeyDescriptor> <md:NameIDFormat>urleth:1.0:naIdentifier</md:NameIDFormat>
            <md:NameIDFormat>urn:oAML:2.0:nameid-format:transient</md:NameIDFormat>
            <md:SingleSignOnService Binding="urntc:SAOST" Location="URL"/>   
            <md:SingleSignOnService Binding="urn:oa2P-Redirect" Location="URL"/>
            <md:SingleSignOnService Binding="urn:mfiles:AuthnRequest" Location="URL"/>
        </md:IDPSSODescriptor>
        <md:Organization>
            <md:OrganizationName xml:lang="en">NAME</md:OrganizationName>
            <md:OrganizationDisplayName xml:lang="en">NAME</md:OrganizationDisplayName>
            <md:OrganizationURL xml:lang="en">URL</md:OrganizationURL>
        </md:Organization>
                <md:ContactPerson contactType="technical">
                 <md:SurName>NAME</md:SurName>
     <md:EmailAddress>EMAIL</md:EmailAddress>
                </md:ContactPerson> 
    </md:EntityDescriptor>

J'ai pour l'instant réussi à l'afficher en entier via ce code:

<?php 
$FichierXML = file_get_contents('URL DU FICHIER XML');
@$parseObj = str_replace($doc->lastChild->prefix.':',"",$FichierXML);
$data= simplexml_load_string($parseObj);
echo "<pre>";
print_r($data);
?>

Ce qui donne:

    [mdEntityDescriptor] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [entityID] => URL
                        )
                    [mdExtensions] => SimpleXMLElement Object
                        (
                            [mdrpiRegistrationInfo] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [registrationAuthority] => URL
                                            [registrationInstant] => 2011-06-01T114742Z
                                        )
                                    [mdrpiRegistrationPolicy] => URL
                                )
                        )
                    [mdIDPSSODescriptor] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [protocolSupportEnumeration] => urnoasisname
                                )

                            [mdExtensions] => SimpleXMLElement Object
                                (
                                    [shibmdScope] => NAME
                                    [mduiUIInfo] => SimpleXMLElement Object
                                        (
                                            [mduiDisplayName] => Array
                                                (
                                                    [0] => NAME
                                                    [1] => NAME
                                                )
                                            [mduiInformationURL] => URL
                                        )
                                )
                            [mdKeyDescriptor] => SimpleXMLElement Object
                                (
                                    [@attributes] => Array
                                        (
                                            [use] => signing
                                        )

                                    [dsKeyInfo] => SimpleXMLElement Object
                                        (
                                            [dsX509Data] => SimpleXMLElement Object
                                                (
                                                    [dsX509Certificate] => 
                          MIIDPDCCAiSg
                                                )
                                        )
                                )
                            [mdNameIDFormat] => Array
                                (
                                    [0] => urnmaceshib
                                    [1] => urnoaat
                                )
                            [mdSingleSignOnService] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [Binding] => urnoasisna
                                                    [Location] => URL
                                                )
                                        )
                                    [1] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [Binding] => urname
                                                    [Location] => URL
                                                )
                                        )
                                    [2] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [Binding] => urnmaceshi
                                                    [Location] => URL
                                                )
                                        )
                                )
                        )
                    [mdOrganization] => SimpleXMLElement Object
                        (
                            [mdOrganizationName] => NAME
                            [mdOrganizationDisplayName] => NAME
                            [mdOrganizationURL] => URL
                        )
                    [mdContactPerson] => SimpleXMLElement Object
                        (
                            [@attributes] => Array
                                (
                                    [contactType] => technical
                                )
                            [mdSurName] => NAME
                            [mdEmailAddress] => EMAIL
                        )
                )

Maintenant je voudrais aller chercher seulement quelques éléments, comme par exemple simplement l'URL du entityID mais je ne parviens à rien, j'ai essayé de cette manière:

$FichierXML = file_get_contents('URL DU XML');
@$parseObj = str_replace($doc->lastChild->prefix.':',"",$FichierXML);
$data= simplexml_load_string($parseObj);
foreach ($data->getElementsByTagName('mdEntityDescriptor') as $valeur) {
$entityID= $valeur->attributes['entityID'];
}

OU

$FichierXML = file_get_contents('URL DU XML');
@$parseObj = str_replace($doc->lastChild->prefix.':',"",$FichierXML);
$data= simplexml_load_string($parseObj);
foreach($data->mdEntityDescriptor as $valeur) {
echo "<li>".$valeur->entityID."</li>";
}

Et de pleins d'autres mais rien à faire je patauge... :)

Est ce qu'une âme charitable pourrait me mettre sur la voie ?

Merci d'avance !

11 réponses


Naïr
Réponse acceptée

Salut,

En regardant le résultat de ton print_r, tu t'aperçois que les attributs (dont l'url) sont stockés dans un tableau associatif, donc je pense que tu dois pouvoir accéder à l'url en faisant non pas un $valeur->entityID mais un $valeur['entityID']

Je ne suis pas un grand expert du XML, mais je pense que tu devrait essayer un parser XML .

Jenjak
Auteur

Hello, merci pour la réponse, j'ai bien sur fait ce tuto, par contre je n'arrive a avoir que quelques valeurs du début de fichier et non l'intégralité... C'est pour cela que je me suis rabbatu sur une autre méthode

Jenjak
Auteur

Oh, ça c'est beau Naïr, ça m'a l'air de fonctionner parfaitement, va falloir que je me repose là dessus et savoir pourquoi j'ai autant bloquer...

Je vais travailler les resultats et vous tenir au courant, vraiment merci :)

si tu regardes comment est composé ton mduiUIInfo
[mduiUIInfo] => SimpleXMLElement Object
(
[mduiDisplayName] => Array
(
[0] => NAME
[1] => NAME
)
[mduiInformationURL] => URL
)

Tu vois que mduiDisplayName est un tableau, donc pour accéder à une valeur du tableau il faudrait faire ça : $tonObjetmduiUIInfo->mduiDisplayName[0]; (pour avoir la 1ère valeur) et $tonObjetmduiUIInfo->mduiDisplayName[1]; (pour avoir la seconde.
Par contre, mduiInformationURL, lui n'est pas un tableau, donc tu obtiens la valeur en faisant un $tonObjetmduiUIInfo->mduiInformationURL;

Donc dans ton cas, tu y accèderas en faisant $valeur->mduiDisplayName;

Jenjak
Auteur

Excuse moi j'ai effacé rapidement mon message car j'ai trouvé la solution.

J'ai fais cela qui fonctionne parfaitement

$FichierXML = file_get_contents('URL DU XML');
@$parsage = str_replace($doc->lastChild->prefix.':',"",$FichierXML);
$resultats= new simpleXMLElement($parsage);
$total = (count($resultats)-1);
for($j=0;$j<$total;$j++){
foreach($resultats->mdEntityDescriptor[$j]->mdIDPSSODescriptor->mdExtensions->mduiUIInfo as $valeur) {
$id = substr($valeur->mduiDisplayName[0], 0, 5);
if ($id == 'TITRE') {
echo "<b><font color='red' size='7px'>$j</font></b> - "; echo "<b>".$valeur->mduiDisplayName[0]."</b></br>";
foreach($resultats->mdEntityDescriptor[$j]->mdIDPSSODescriptor->mdKeyDescriptor->dsKeyInfo->dsX509Data as $valeur) {
echo "".$valeur->dsX509Certificate."<br /><br />";
}
}
}
}

Milles mercis pour ton aide Naïr

Jenjak
Auteur

Juste pour info vu que je bloque sur le entityID, afin d'avoir celui par exemple des mdEntityDescriptor [N° que je veux] ça serait bien

for($j=0;$j<$total;$j++){
    foreach($resultats->mdEntityDescriptor[$j]->mdIDPSSODescriptor->mdExtensions->mduiUIInfo as $valeur) {
    $id = substr($valeur->mduiDisplayName[0], 0, 5);
        if ($id == 'TITRE') {
        $i++;
        echo "<b><font color='red' size='7px'>$j</font></b> - "; echo "<b>".$valeur->mduiDisplayName[0]."</b></br>";
            foreach($resultats->mdEntityDescriptor[$j] as $valeur) {                
            echo "<b><u><i><font color='blue'>entityID</u> =</font></i></b> ".$valeur['entityID']."<br /><br />";
            }
            foreach($resultats->mdEntityDescriptor[$j]->mdIDPSSODescriptor->mdKeyDescriptor->dsKeyInfo->dsX509Data as $valeur) {                
            echo "<b><u><i><font color='blue'>CLE ASSOCIEE</u> =</font></i></b> ".$valeur->dsX509Certificate."<br /><br />";
            }       
        }       
    }   
}

Pour info je tri d'abord dans $id seulement les lignes que je veux, ensuite je vais chercher les valeurs.

Ca me semble "logique", j'arrive a recuperer le dsX509Certificate correspondant au mduiDisplayName, par contre pour le entiry ID ça me retourne 4/5 lignes entityID = avec derrière aucune valeur, par contre quand j'enlenve le [$j] a mdEntityDescriptor ça me retourne bien toutes les valeurs de entityID

Alors, soit tu peux n'avoir qu'un seul entityID et dans ce cas, cela de sert à rien de faire un foreach et tu peux utiliser directement $resultats->mdEntityDescriptor['entityID'], es-tu sûr de pouvoir avoir plusieurs entityID ?

Jenjak
Auteur

Salut Naïr, Oui je peux en utiliser plusieurs, encore une fois je me suis enteté avec un foreach alors que cela est inutile, tout fonctionne parfaitement, je suis en train de faire pas mal de bidouilles, mon prochain défi sera de trier les résultats, d'après ce que j'ai pu comprendre il va falloir que je les mette dans un tableau puis que je fasse un tri dans celui ci :)

Jenjak
Auteur

Hello !

J'ai pas mal avancé sur monde code grace à vous ! Par contre depuis hier je bloque sur un soucis au niveau du tri de mon tableau, en effet j'ai rèussi à le faire grace a une fonction mais celle-ci remplace dans ma liste le VALUE par l'ordre de tri des lignes.

Pour m'expliquer voici mon code:

$FichierXML = file_get_contents('URL DU XML');
@$parsage = str_replace($document->lastChild->prefix.':',"",$FichierXML);
$resultats= new simpleXMLElement($parsage);
$total = (count($resultats)-1);

for($j=0;$j<$total;$j++) {
    foreach($resultats->mdEntityDescriptor[$j]->mdIDPSSODescriptor->mdExtensions->mduiUIInfo as $valeur) {
        $id = substr($valeur->mduiDisplayName[0], 0, 5);
        $entityID = str_replace('https//', 'https://', $resultats->mdEntityDescriptor[$j]['entityID']);
        $name = $valeur->mduiDisplayName[0];
            $IDProviders[titre] = array(
                'Name' => "NOM",
                'Type' => "category",
            );
        if ($id == 'TITRE') {
            $IDProviders[$entityID] = array(
                'SSO' => "$entityID",
                'Name' => "$name",
                'Type' => "titre",
            );  
        }
            $IDProviders[titre] = array(
                'Name' => "NOM",
                'Type' => "category",
            );
        if ($id == 'TITRE') {
            $IDProviders[$entityID] = array(
                'SSO' => "$entityID",
                'Name' => "$name",
                'Type' => "titre",
            );      
        }
    }
}

Dans ma liste déroulante pour choisir j'ai bien un truc du genre:

<option title="url du site" value="$entityID1">$name1</option>
<option title="url du site" value="$entityID2">$name2</option>
<option title="url du site" value="$entityID3">$name3</option>
...

Par contre si je tri je me retrouve avec:

<option title="url du site" value="0">$name1</option>
<option title="url du site" value="1">$name2</option>
<option title="url du site" value="2">$name3</option>
...

Le value est très important pour faire passer mon url de l'entityID, est il possible de trier sans toucher à ça ?

Je voudrais bien sûr trier sur le 'Name' => "$name" :)

Merci :)

Jenjak
Auteur

Je me répond à moi même:

foreach ($IDProviders as $key => $valeur) {
    $Name[$key] = $valeur['Name'];
}

array_multisort($Name, SORT_ASC, $IDProviders);