simplexml_load_string - simplexmlelement php ejemplo
Parse XML con Namespace usando SimpleXML (7)
Debe registrar el espacio de nombres para cada objeto simpleXMLElement que use.
$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace(''e'', ''http://www.webex.com/schemas/2002/06/service/event'');
foreach($xml->xpath(''//e:event'') as $event) {
$event->registerXPathNamespace(''e'', ''http://www.webex.com/schemas/2002/06/service/event'');
var_export($event->xpath(''//e:sessionKey''));
}
El espacio de nombre también debe declararse en algún lugar del archivo xml.
<event:event xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
...
El método ax descrito también funciona. Puede omitir el registerXPathNamespace si sabe que el archivo xml siempre usará el mismo prefijo.
Tengo esto como 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>
¿Cómo puedo recorrer todo el evento: nodos de eventos y mostrar, por ejemplo, todo el evento: SessionKey''s?
Esto no funciona:
$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''));
}
Después de haber trabajado mucho con simplexml, así es como lo hago.
El truco de magia, si ya tienes un elemento y solo quieres obtenerlo, es diferente para los niños del espacio de nombres, por ejemplo, para una estructura como esta:
<entry>
<title type="text">My test entry</title>
<gd:when startTime="2017-02-26T02:00:00Z" endTime="2017-02-26T03:00:00Z"/>
<gc:notes type="string">A type</gc:notes>
</entry>
Es para enviar verdadero como el segundo parámetro a la función de los niños:
$title = (string) $entry->title;
$gd = $entry->children(''gd'', TRUE);
$attrs = $gd->when->attributes();
$startTime = (string) $attrs->startTime;
$gc = $entry->children(''gc'', TRUE);
$notes = (string) $gc->notes();
Otro enfoque es usar SimpleXML
para el análisis sintáctico y DOMDocument
para la manipulación / acceso, que elude por completo los problemas de espacio de nombres:
$xml = new SimpleXMLElement($r);
$xml = dom_import_simplexml($xml);
$nodelist= $xml->getElementsByTagName(''event'');
for($i = 0; $i < $nodelist->length; $i++) {
$sessions = $nodelist->item($i)->getElementsByTagName(''sessionKey'');
echo $sessions->item(0)->nodeValue;
}
Podría estar equivocado, pero no creo que XML con el símbolo de dos puntos como SOAP se pueda analizar correctamente utilizando SimpleXMLElement
.
Estoy seguro de que hay una manera más elegante de hacerlo, pero generalmente leo el contenido del archivo en una variable usando file_get_contents()
luego reemplazo / elimino los dos puntos y luego los envío a SimpleXMLElement
.
Usar registerXPathNamespace
y luego llamar a xpath
realidad no funcionó para mí. Tenía que ir con la solución proporcionada en esta gran publicación: http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html
Entonces en tu caso, esto:
echo $xml->children(''http://www.webex.com/schemas/2002/06/service/event'')->sessionName;
Se producirá:
Aprende QB en minutos
aquí una alternativa que funcionó para mí.
$xml = simplexml_load_string($r);
$ns = $xml->getNamespaces(true);
foreach ($xml->children($ns[''event''])->event as $skey) {
$sessionKey = $skey->children($ns[''event''])->sessionKey;
echo $sessionKey;
}
funciona sin registerXPathNamespace
y el prefijo de espacio de nombres completo en las consultas xpath:
$xml = new SimpleXMLElement($r);
foreach($xml->xpath(''//event:event'') as $event) {
var_export($event->xpath(''event:sessionKey''));
}