2016-07-17 1 views
1

Donc, ceci est une question de suivi à ma question précédente qui a été résolu, voici le lien vers elle: using data from child element to select data in other element using simplexml in phpattributs dans des causes profondes fichier xml pour ne pas charger par simplexml php

grâce à @RomanPerekhrest pour résoudre ce.

Je possède ce morceau de code PHP en utilisant SimpleXML pour lire mon fichier xml

<?php 



    $xml = simplexml_load_file('../uploads/reports/report.xml'); 

$hits = $xml->xpath("results/hits/@rule_id"); 
$ruleIds = array_map(function($v){ // getting search path for each needed rule 
    return "profile_info/rules/rule[@id='". (string)$v. "']"; 
}, $hits); 

foreach ($xml->xpath(implode(" | ", $ruleIds)) as $rule) { 
    echo '<div id="name">'. $rule->display_name .'</div>'. 
     '<div id="comment">'. $rule->display_comment .'</div>'; 
}           
?> 

à nouveau, grâce à @RomanPerekhrest pour venir avec cela.

Ce morceau de code fonctionne très bien avec mon fichier XML simplifié que j'ai créé pour illustrer mes problèmes dans mes questions précédentes, mais quand je l'applique, il ne semble pas rendre.

J'ai trouvé la raison pour laquelle, dans mon élément racine, il y a des attributs xmlns qui empêchent mon xml de se charger. Lorsque je supprime manuellement ces attributs, tout fonctionne comme prévu. (Je ne vais pas la liste du document entier xml, car il est 8500+ lignes longues) Voici l'élément racine avec les attributs:

<report xsi:schemaLocation="http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd" xmlns="http://www.callassoftware.com/namespace/pi4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

je besoin d'un moyen de contourner en php. Vu que ces fichiers xml sont générés par d'autres logiciels et l'absence de paramètres dans cette génération, je ne peux pas simplement faire ces fichiers xml sans ces attributs.

Merci

+0

addreses: 'http://www.callassoftware.com/namespace/pi4 pi4_results_schema.xsd' et' http: // www.callassoftware.com/namespace/pi4' sont invalides et retournent 'Non trouvé' – RomanPerekhrest

+0

c'est ce que j'ai remarqué aswel, ça fait que tout mon xml ne parvient pas à lire, je ne suis pas vraiment sûr de la façon d'aborder ce problème –

+0

@RomanPerekhrest Les identifiants d'espace de noms ne doivent pas vraiment être résolus nulle part. Ce sont des URI qui empêchent tout le monde d'utiliser les mêmes noms. – IMSoP

Répondre

3

Votre XML a espace de noms par défaut déclaré à l'élément racine, qui éléments descendants sans préfixe héritent implicitement:

xmlns="http://www.callassoftware.com/namespace/pi4" 

Pour faire référence à l'élément dans l'espace de noms par défaut, vous devez mapper un préfixe à l'URI de l'espace de noms par défaut, puis utilisez ce préfixe dans votre XPath:

//register prefix 'd' to reference default namespace URI 
$xml->registerXPathNamespace('d', 'http://www.callassoftware.com/namespace/pi4'); 

//use the prefix to reference elements in the default namespace 
$hits = $xml->xpath("d:results/d:hits/@rule_id"); 
$ruleIds = array_map(function($v){ // getting search path for each needed rule 
    return "d:profile_info/d:rules/d:rule[@id='". (string)$v. "']"; 
}, $hits); 
+0

cela fonctionne, merci de votre aide! –