varios simplexmlelement recorrer nodos leer extension crear con como atributos archivos php xml simplexml

simplexmlelement - recorrer nodos xml php



PHP SimpleXML. ¿Cómo obtener el último artículo? (6)

¿Cómo obtendría el último elemento (o cualquier elemento específico para ese asunto) en un objeto simplexml? Supongamos que no sabe cuántos nodos habrá.

ex.

<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/xsl.xml"?> <obj href="http://xml.foo.com/" display="com.foo.bar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://obix.org/ns/schema/1.0" > <list name="data" of="HistoryRecord"> <obj> <abstime name="timestamp" val="1876-11-10T00:00:00-08:00"></abstime> <int name="energy_in_kwh" val="1234"></int> <int name="energy_out_kwh" val="123456"></int> </obj> <obj> <abstime name="timestamp" val="1876-11-10T00:15:00-08:00"></abstime> <int name="energy_in_kwh" val="1335"></int> <int name="energy_out_kwh" val="443321"></int> </obj> </list> <int name="count" val="2"></int> </obj>

Y quiero tomar el último fragmento <obj></obj> (o incluso solo una parte).


Creo que SimpleXML carga todo el XML de todos modos y (si no recuerdo mal) puede usar los nodos SimpleXML como si fueran matrices, por lo que podría usar funciones de matriz para obtener el último nodo. Hace un tiempo que utilizo PHP, pero debería poder obtener la longitud y luego obtener el elemento a la larga-1 ...

Editar: Por supuesto, puede usar XPath, pensé que debería mencionarlo también, pero no estaba seguro de si last() funcionó en la implementación SimpleXML XPath.

No estoy seguro de cuál es el más rápido, usando índices de matriz o XPath, supongo que los índices de matriz son más rápidos, pero debe probar ambos en un bucle unos miles de veces obteniendo el tiempo antes y después del ciclo para verificar.

Pero como siempre en CS: lo que eliges depende de muchas cosas.

¿Es crítico en el tiempo o se usa con mucha frecuencia? Luego, encuentre la solución más rápida.

Si necesita consultas más complicadas y la velocidad no es un problema: utilice lo que sea más fácil de implementar y le dé la potencia que necesita (XPath es bueno para la navegación de árbol compleja, la indexación de matriz es buena para el acceso aleatorio rápido en las estructuras de datos de tipo lista ; XML se puede usar para ambos).


Hay una expresión XPath que hará exactamente lo que quieras:

$xml=''<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="/xsl.xml"?> <obj href="http://xml.foo.com/" display="com.foo.bar" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://obix.org/ns/schema/1.0" > <list name="data" of="HistoryRecord"> <obj> <abstime name="timestamp" val="1876-11-10T00:00:00-08:00"></abstime> <int name="energy_in_kwh" val="1234"></int> <int name="energy_out_kwh" val="123456"></int> </obj> <obj> <abstime name="timestamp" val="1876-11-10T00:15:00-08:00"></abstime> <int name="energy_in_kwh" val="1335"></int> <int name="energy_out_kwh" val="443321"></int> </obj> </list> <int name="count" val="2"></int> </obj>''; $x=simplexml_load_string($xml); $x->registerXPathNamespace(''obix'', ''http://obix.org/ns/schema/1.0''); $objects=$x->xpath(''/obix:obj/obix:list/obix:obj[last()]''); print_r($objects);

Por ejemplo /bookstore/book[last()] seleccionará el último elemento de libro que es el elemento secundario del elemento librería.


Puedes comenzar con esto ... Podrás desenterrarlo ... No me gusta que usen el mismo nombre de etiqueta en 2 niveles ... Intento evitar nombres de etiquetas duplicados.

<?php $s = simplexml_load_file(''in.xml''); $s->registerXPathNamespace(''obix'', ''http://obix.org/ns/schema/1.0''); $items = $s->xpath(''//obix:list''); ?>


Use la last() función last() XPath, que resuelve este problema:

<?php $xml = simplexml_load_file(''HistoryRecord.xml''); $xml->registerXPathNamespace(''o'', ''http://obix.org/ns/schema/1.0''); $xpath = "/o:obj/o:list/o:obj[last()]/o:int[@name = ''energy_in_kwh'']"; $last_kwh = $xml->xpath($xpath); ?>

Aquí busca el último <obj> interno, y allí para el <int> con el nombre de "energy_in_kwh" .

Tenga cuidado con el registro del espacio de nombres. (Todos sus elementos son parte del espacio de nombres "http://obix.org/ns/schema/1.0" , la consulta XPath debe reflejar eso.

EDITAR: Tenga en cuenta que [last()] es equivalente a [position() = last()] .


La forma más rápida de acceder a los nodos en XML, para un programador, es XPath. Eche un vistazo a los métodos xpath y xpath en sí .


Como ya se mencionó, puede usar notación y funciones de matriz.

<?php $xml = simplexml_load_file(''HistoryRecord.xml''); $lastObj = $xml->list->obj[$xml->list->obj->count()-1];

o

$lastObj = $xml->list->obj[count($xml->list->obj)-1];

También puede usar end() para obtener el último elemento, pero solo si siempre tiene más de un <obj>; de lo contrario, obtendrá un resultado diferente.