2017-10-04 5 views
0

Vu le code XML suivant:PHP - Impossible d'analyser attribut à l'aide SimpleXML

<data xmlns:ns2="..."> 
    <versions> 
      <ns2:version type="HW">E</ns2:version> 
      <ns2:version type="FW">3160</ns2:version> 
      <ns2:version type="SW">3.4.1 (777)</ns2:version> 
    </versions> 
    ... 
</data> 

Je suis en train d'analyser le troisième attribut ~ NS2: version type = « SW », mais lorsque vous exécutez le code suivant, je ne reçois rien. .

$s = simplexml_load_file('data.xml'); 

echo $s->versions[2]->{'ns2:version'}; 

l'exécution de cette donne le résultat suivant:

$s = simplexml_load_file('data.xml'); 

var_dump($s->versions); 

enter image description here

Comment puis-je obtenir correctement cet attribut?

Répondre

1

Vous avez une XML assez ennuyeux de travailler avec là-bas, au moins en ce qui concerne SimpleXML.

Vos version éléments sont dans l'espace de noms ns2, donc pour faire une boucle sur eux, vous devez faire quelque chose comme ceci:

$s = simplexml_load_string($xml); 

foreach ($s->versions[0]->children('ns2', true)->version as $child) { 
    ... 
} 

La méthode children() retourne tous les enfants de l'étiquette actuelle, mais seulement dans l'espace de noms par défaut. Si vous souhaitez accéder à des éléments dans d'autres espaces de noms, vous pouvez passer l'alias local et le deuxième argument true.

La partie la plus compliquée est que les attributs type sont et non considérés comme faisant partie de ce même espace de noms. Cela signifie que vous ne pouvez pas utiliser le formulaire standard $element['attribute'] pour y accéder, car votre élément et votre attribut se trouvent dans des espaces de noms différents.

Heureusement, la méthode de SimpleXML attributes() fonctionne de la même manière que children(), et ainsi d'accéder aux attributs de l'espace de noms global, vous pouvez passer une chaîne vide:

$element->attributes('')->type 

En pleine, c'est:

$s = simplexml_load_string($xml); 

foreach ($s->versions[0]->children('ns2', true)->version as $child) { 
    echo (string) $child->attributes()->type, PHP_EOL; 
} 

Cela vous obtenir la sortie

HW 
FW 
SW 
+0

ver Thankyou y beaucoup! – BDillan

0

Pour obtenir le troisième attribut.

$s = simplexml_load_file('data.xml'); 
$sxe = new SimpleXMLElement($s); 
foreach ($sxe as $out_ns) { 
    $ns = $out_ns->getNamespaces(true); 
    $child = $out_ns->children($ns['ns2']); 
} 

echo $child[2]; 

eteint:

3.4.1 (777)