simplexmlelement simplexml_load_file recorrer nodos new leer ejemplo con complejo php xml namespaces simplexml

simplexml_load_file - recorrer nodos xml php



Biblioteca PHP para analizar XML con dos puntos en los nombres de las etiquetas (4)

Esta pregunta ya tiene una respuesta aquí:

He estado tratando de usar SimpleXML , pero parece que no me gusta XML que se ve así:

<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>

Entonces, ¿qué biblioteca manejará las etiquetas que se ven así (tienen dos puntos en ellas)?


Colon denota un espacio de nombres XML. DOM tiene un buen soporte para espacios de nombres.


Digamos que tienes un xml como este.

<xhtml:div> <xhtml:em>italic</xhtml:em> <date>2010-02-01 06:00</date> </xhtml:div>

Puede acceder a ''em'' de esta manera: $xml->children(''xhtml'', true)->div->em;

sin embargo , si desea el campo de fecha, esto: $xml->children(''xhtml'', true)->div->date; no funcionará , porque estás atrapado en el espacio de nombres xhtml.

debe ejecutar ''hijos'' nuevamente para volver al espacio de nombres predeterminado:

$xml->children(''xhtml'', true)->div->children()->date;


No creo que sea una buena idea deshacerse del colon o reemplazarlo con algo más, como sugirieron algunas personas. Puede acceder fácilmente a los elementos que tienen un prefijo de espacio de nombres. Puede pasar la URL que identifica el espacio de nombres como argumento del método children () o pasar el prefijo del espacio de nombres y "verdadero" al método children (). El segundo enfoque requiere PHP 5.2 y superior.

SimpleXMLElement::children


Si quiere arreglarlo rápidamente, haga esto (lo hago cuando me siento flojo) :

// Will replace : in tags and attributes names with _ allowing easy access $xml = preg_replace(''~(</?|/s)([a-z0-9_]+):~is'', ''$1$2_'', $xml);

Esto convertirá <xhtml: a <xhtml_ y </xhtml: a </xhtml_ . Tipo de hacky y puede fallar si están involucrados bloques de contenedor XML de NameSpaced de CDATA o nombres de etiqueta de UNICODE, pero yo diría que por lo general es seguro usarlo (aún no me ha fallado) .