tutorial simplexmlelement simplexml_load_string namespace leer ejemplo create con array php xml namespaces simplexml

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 .



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'')); }