2009-07-27 10 views
14

Estoy tratando de leer un canal RSS de Flickr pero tiene algunos nodos que no son legibles por Simple XML (media:thumbnail, flickr:profile, etc.).XML simple: tratamiento de los puntos en los nodos

¿Cómo puedo evitar esto? Me duele la cabeza cuando veo la documentación del DOM. Así que me gustaría evitarlo ya que no quiero aprender.

Estoy tratando de obtener la miniatura por cierto.

+0

Relacionado: [Biblioteca PHP para analizar XML con dos puntos en nombres de etiquetas?] (Http://stackoverflow.com/q/1575788/367456) – hakre

Respuesta

18

La solución se explica en this nice article. Necesita el método children() para acceder a los elementos XML que contienen un espacio de nombres. Este fragmento de código se cita del artículo:

$feed = simplexml_load_file('http://www.sitepoint.com/recent.rdf'); 
foreach ($feed->item as $item) { 
    $ns_dc = $item->children('http://purl.org/dc/elements/1.1/'); 
    echo $ns_dc->date; 
}
+0

Si el XML tenía esta etiqueta cómo entonces, ¿obtendrías el enlace? –

+0

@PapaDeBeau Propongo hacer esto como una pregunta separada. – vog

2

¿Está tratando con un espacio de nombres? Creo que debes usar el método -> niños.

$ns_dc = $item->children('http://namespace.org/'); 

¿Puede proporcionar un fragmento con la declaración xml?

1

Con la última versión, ahora puede hacer referencia a los nodos colon con llaves.

$item->{'itunes:duration'} 
0

Un método aún más sencillo el uso de PHP de acceder namespaced nodos XML sin declarando un espacio de nombres es ....

Con el fin de obtener el valor de <su:authorEmail> de la siguiente fuente

<item> 
    <title>My important article</title> 
    <pubDate>Mon, 29 Feb 2017 00:00:00 +0000</pubDate> 
    <link>https://myxmlsource.com/32984</link> 
    <guid>https://myxmlsource.com/32984</guid> 
    <author>Blogs, Jo</author> 
    <su:departments> 
    <su:department>Human Affairs</su:department> 
    </su:departments> 
    <su:authorHash>4f329b923419b3cb2c654d615e22588c</su:authorHash> 
    <su:authorEmail>hIwW14tLc+4l/oo7agmRrcjwe531u+mO/3IG3xe5jMg=</su:authorEmail> 
    <dc:identifier>/32984/Download/0032984-11042.docx</dc:identifier> 
    <dc:format>Journal article</dc:format> 
    <dc:creator>Blogs, Jo</dc:creator> 
    <slash:comments>0</slash:comments> 
</item> 

utilizar el siguiente código:

$rss = new DOMDocument(); 

$rss->load('https://myxmlsource.com/rss/xml'); 

$nodes = $rss->getElementsByTagName('item'); 

foreach ($nodes as $node) { 
    $title = $node->getElementsByTagName('title')->item(0)->nodeValue; 
    $author = $node->getElementsByTagName('author')->item(0)->nodeValue; 
    $authorHash = $node->getElementsByTagName('authorHash')->item(0)->nodeValue; 
    $department = $node->getElementsByTagName('department')->item(0)->nodeValue; 
    $email = decryptEmail($node->getElementsByTagName('authorEmail')->item(0)->nodeValue); 
} 
Cuestiones relacionadas