2009-10-16 13 views
31

que he estado tratando de utilizar SimpleXML, pero no parece como XML que tiene este aspecto:Biblioteca PHP para analizar XML con dos puntos en nombres de etiqueta?

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

Entonces, ¿qué biblioteca se encargará de las etiquetas que se ven como que (tienen dos puntos en ellos)?

+1

Por favor, después el fragmento de código correspondiente. SimpleXML no debería tener ningún problema con los espacios de nombres. –

+0

También he experimentado el mismo problema con 'SimpleXMLElement ($ data)' devolviendo nulo si los datos xml tienen dos puntos en las etiquetas. –

Respuesta

64

Digamos que tiene algunos xml como este.

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

Se puede acceder a ellos 'como esto: $xml->children('xhtml', true)->div->em;

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

debe ejecutar 'hijos' de nuevo para volver al espacio de nombres por defecto:

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

no estoy seguro de por qué esta no es la respuesta seleccionada. ¡Pero para cualquiera en el futuro, este es el que resolvió mis preguntas/problemas! :) – daveomcd

7

Dos puntos denota un espacio de nombres XML. El DOM tiene un buen soporte para espacios de nombres.

+0

SimpleXML probablemente también, pero el OP está buscando una etiqueta "xhtml: div" en lugar de solo "div". –

+0

SimpleXML tiene * algunas * cosas para manejarlo, pero todavía no puedo hacerlo funcionar correctamente. – mpen

18

Si desea corregir rápidamente hacer esto (que hago cuando me siento perezoso):

// 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: en <xhtml_ y </xhtml: en </xhtml_. Tipo de hacky y puede fallar si se trata de bloques de contenedor XML con nombre de espacio de CDATA o nombres de etiqueta de UNICODE, pero yo diría que generalmente está seguro al usarlo (no me ha fallado aún).

+4

Eso es sucio. Pero bueno;) – joedevon

+0

Funciona pero es un poco hacky ... atornilló el contenido de mis etiquetas '' y cambió el tiempo – supersan

2

No creo que sea una buena idea deshacerse del colon o reemplazarlo con algo más, como lo 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

+0

¿No es esto exactamente lo que sugirió Nathan Reed en la respuesta que acepté? Estoy de acuerdo en que regex-fu es un hack sucio, pero tener que pasar por el selector 'children()' tampoco es muy divertido. – mpen

+0

Sí, lo mismo. Solo quería indicar que también puede pasar la URL que identifica el espacio de nombres al método children() que funciona con PHP 5 y superior. En mi humilde opinión, no hay necesidad de hacer un hack sucio, cuando hay un método central disponible. –

Cuestiones relacionadas