Analyse XML avec l'espace de Noms à l'aide de SimpleXML
J'ai ce que xml:
<root xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
<event:event>
<event:sessionKey></event:sessionKey>
<event:sessionName>Learn QB in Minutes</event:sessionName>
<event:sessionType>9</event:sessionType>
<event:hostWebExID></event:hostWebExID>
<event:startDate>02/12/2009</event:startDate>
<event:endDate>02/12/2009</event:endDate>
<event:timeZoneID>11</event:timeZoneID>
<event:duration>30</event:duration>
<event:description></event:description>
<event:status>NOT_INPROGRESS</event:status>
<event:panelists></event:panelists>
<event:listStatus>PUBLIC</event:listStatus>
</event:event>
...
</root>
Comment puis-je faire une boucle par tous de l'événement:événement de nœuds et d'affichage, par exemple, l'ensemble de l'événement:SessionKey de l'?
Cela ne fonctionne pas:
$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
foreach($xml->xpath('//e:event') as $event) {
var_export($event->xpath('//e:sessionKey'));
}
- Cela peut vous aider lornajane.net/posts/2010/...
- ne travaille pas et n'a jamais été une bonne description de l'erreur. PHP vous donne le message d'erreur suivant: "Avertissement: SimpleXMLElement::xpath(): Undefined préfixe d'espace de noms". Si vous développer des logiciels, vous devriez écouter PHP de mise en garde. Voir aussi: Comment obtenir les messages d'erreur utiles en PHP?
Vous devez vous connecter pour publier un commentaire.
il fonctionne sans
registerXPathNamespace
et le plein préfixe d'espace de noms dans les requêtes xpath:Vous devez vous inscrire à l'espace de noms pour chaque objet simpleXMLElement vous utilisez.
L'espace de noms doit également être déclaré quelque part dans le fichier xml.
La méthode ax décrit fonctionne aussi. Vous pouvez ignorer les registerXPathNamespace si vous savez que le fichier xml est toujours le même préfixe.
ici la variante qui a fonctionné pour moi.
children()
avec au moins son premier paramètre. Si vous connaissez la structure du document avant de la main, vous pouvez même taper le nom d'espace de noms (ou son URI) manuellement comme une alternative àgetNamespaces()
.$ns = (object) $xml->getNamespaces(true);
ensuite, Vous pouvez l'utiliser comme$sessionKey = $skey->children($ns->event)->sessionKey;
Avoir beaucoup travaillé avec simplexml, c'est comment je le fais.
Le tour de magie si vous avez déjà un élément et vous voulez juste pour obtenir différents espaces enfants, par exemple pour une structure comme ceci:
Est à envoyer vrai que le deuxième paramètre de la fonction children:
Une autre approche consiste à utiliser
SimpleXML
pour l'analyse et l'DOMDocument
pour la manipulation d'accès, qui contourne namespacing questions tout à fait:À l'aide de
registerXPathNamespace
et puis l'appel dexpath
n'a pas vraiment fonctionné pour moi.J'ai dû aller avec la solution fournie dans ce grand poste : http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html
Donc dans votre cas, c' :
Sera de sortie:
Je peux me tromper mais je ne pense pas que XML avec le symbole deux-points comme le SAVON peut être analysée correctement à l'aide de
SimpleXMLElement
.Je suis sûr qu'il ya une façon plus élégante de le faire, mais j'ai l'habitude de lire le contenu du fichier dans une variable à l'aide de
file_get_contents()
puis remplacer/supprimer le deux-points, puis de l'envoyer àSimpleXMLElement
.