Foros del Web » Programación para mayores de 30 ;) » Programación General »

Identificadores unicos en simplexml

Estas en el tema de Identificadores unicos en simplexml en el foro de Programación General en Foros del Web. Hola. Estoy con una galeria de imagenes, a las que quiero escribirles comentarios. Hasta hoy me las arregle con un texto subdividido y busquedan via ...
  #1 (permalink)  
Antiguo 10/08/2009, 17:31
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Identificadores unicos en simplexml

Hola. Estoy con una galeria de imagenes, a las que quiero escribirles comentarios. Hasta hoy me las arregle con un texto subdividido y busquedan via php. Pero quiero tener la data en xml en vez de en texto plano.

Ya consegui hacer un archivo xml usando simplexml. Y sin embargo, mi estructura no resulta util a la hora de identificar precisamente la foto que busco para comentar. Miren:

<listado>
<libro foto="juego.jpg">
<titulo>Cultura del Juego</titulo>

<descripcion>
Escrito por M.
</descripcion>

</libro>
</listado>

Con una serie de items (libros en este caso), yo esperaría que al modificar la descripcion y buscar la antigua descripcion, el acceso fuera así:

xml->libro[foto=$foto]->titulo; // ejemplo aproximado

Aqui, $titulo es la variable que me permitirá acceder a este libro (el identificador unico, que es nada mas y nada menos que el nombre de la foto que estoy queriendo comentar).

Intenté acceder via Xpath, pero no pude. Asi que por ahora doy esta vuelta:

<libro>
<juegodotjpg>
<titulo></titulo>
<descripcion></descripcion>
</juegodotjpg>
</libro>

Y sí funciona, pero es horrible.

Pueden ayudarme a generar un identificador unico para un tag, y acceder a sus contenidos mediante algo como 'children' (se que un atributo no tiene 'children', pero en mi intento la logica es acceder al hijo de un determinado libro via su identificador unico).

Gracias mil.
  #2 (permalink)  
Antiguo 11/08/2009, 06:59
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

En general para identificar un libro se le pone un ID como ser el ISBN por ejemplo...así con DOM puedes hacer un getElementById...

Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 11/08/2009, 09:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

Muchas gracias.

ISBN no es namespace ni nada de eso, no? Da lo mismo escribir 'id' o 'nombre_foto'?

Y ya veo que tendre que usar DOM con GetElementById para setear nuevos valores, porque simplexml no me permite hacerlo (creo) (se me hace pesado estudiar todo sobre la marcha, pero con el correr de los dias lo acepto).

Ah! Finalmente, estoy usando esto:

<listado>
<libro>
<titulo id="juego.jpg">Cultura del Juego</titulo>

<descripcion id="juego.jpg">Escrito por M.</descripcion>

</libro>
</listado>

Es decir, un id para cada nodo hijo, en vez de para el padre. Pero para nada convencido.

Xpath permitiria acceder tanto al id de un padre como el de un hijo. Es solo que yo no sabia que SIEMPRE el resultado es un array, y entonces hay que tomarlo asi:

$resultado[0] (aunque sea un unico resultado el que tire)

UNa ultima consulta. Xpath permite setear valores?
  #4 (permalink)  
Antiguo 11/08/2009, 09:17
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

Olvídate de Xpath...usa DOM que son sus funciones puedes hacer lo que quieras

Ahora bien, yo el ID lo pondría en el padre, y de él saco la info que quirero (titulo, desc)...Porque sino tienes 2 tags con el mismo ID y eso está mal...

Saludos
__________________
Esteban Quintana
  #5 (permalink)  
Antiguo 12/08/2009, 07:18
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

Gracias por hacer enfasis en DOM. Ya veo que los metodos para setear estan ahi.

Ahora te pido mayor guia, porque fuera del manual de php, no encuentro tutoriales. Lo que quiero es setear un valor a una par de hijos, sabiendo el id que tiene un nodo padre.

Imagino esto, pero la verdad es que el manual no me da pista.



$xml->getElementsByTagName(libro)->getAttribute(id)->getElementsByTagName(titulo)->Las mil y una noches;

Va por ahi? Como le paso el nombre unico a id?

Última edición por mayid; 12/08/2009 a las 07:28 Razón: con mayores referencias
  #6 (permalink)  
Antiguo 12/08/2009, 08:29
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

sería algo así como

$xml->getElementById('esteban')->getElementsByTagName('titulo')->item(0)->nodeValue;

Fácil no ?


PD: Sobre tutoriales busca por internet, hay miles...
__________________
Esteban Quintana
  #7 (permalink)  
Antiguo 12/08/2009, 09:13
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

Si que es facil esto del id. Mil gracias!

Ahora lo que me falta es setear un value. Se hace asi
->item(0) == "contenido"; ?

La verdad es que no encontre casi documentacion en google. Y creo que los foros la van generando.

Ahora tengo esto para resolver:
$xml->getElementById($foto)->getElementsByTagName(titulo)->item(0);
_Call to a member function getElementsByTagName() on a non-object in <b>D:\wamp\www\subida_v5\libreria\cambios_en_xml.p hp on line
  #8 (permalink)  
Antiguo 12/08/2009, 09:21
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

checkea

http://us3.php.net/manual/en/book.dom.php

Ahí están todas las funciones, checkea appendDada, insertData, replaceData...

Y checkea

http://www.w3schools.com/dom/dom_nodes_set.asp

Se puede como tu dices...

Saludos
__________________
Esteban Quintana
  #9 (permalink)  
Antiguo 12/08/2009, 09:46
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

Hasta aqui veniamos bien. Gracias.

Mira. Para usar getElementById necesito validar mi xml (con algo llamado DTD). Pero mi documento no valida, porque los id no pueden empezar con numeros (y muuuchas veces los usuarios suben fotos que empiezan con un numero).

Voy a intentar ponerles una "a" en los id´s, y con esto creo que todo ira bien.
  #10 (permalink)  
Antiguo 12/08/2009, 11:05
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

De donde sacaste eso ?

El XML debe ser correcto, pero puede no tener DTD...Y un atributo puede perfectamente ser numérico...

Saludos
__________________
Esteban Quintana
  #11 (permalink)  
Antiguo 12/08/2009, 11:53
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

Aqui encontre un listado de como hacer selecciones por ID.

https://fosswiki.liip.ch/display/BLOG/GetElementById+Pitfalls

No termino de entender que es un DTD, pero no lo quisiera usar. Usare XPath (si logro hacerlo funcionar).

Fuera del manual PHP (que en su seccion DOM es muuy complicado), esta el tutorial de W3schools que me pasastes. Yo lo habia descartado porque se explaya sobre javascript. Pero creo que los metodos de DOM son identicos entre php y js, salvo por el uso de '->' en vez de ' . '
  #12 (permalink)  
Antiguo 12/08/2009, 11:58
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

Eso es lo lindo del DOM, que usa las mismas funciones en cualquier lenguaje...Es un standard...

El DTD define como será el XML pero puedes no usarlo...es para hacerlo más estricto aún...

en w3school tiene tutoriales de varios lenguajes, php, js, html...es muy bueno el sitio

Saludos
__________________
Esteban Quintana
  #13 (permalink)  
Antiguo 12/08/2009, 12:16
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

Mira. Casi termino:

$xpath = new DOMXPath($xml);
$set = $xpath->query("//*[@id = '".$foto."']");
$resultado = $set->item(0)->getElementsByTagName($seccion)->item(0)->childNodes->item(0)->nodeValue;

Con esto, obtengo los datos especificos que le pido al xml.

Pero no se como setear un cambio, ni como grabarlo. Obtengo errores.

[...] -> nodeValue = $contenido;
$xml->saveXML(); // con esto, hace de cuenta que setea, y devuelve lo que le doy.

$xml->saveXML($resultado); // con esto ultimo, da error.
  #14 (permalink)  
Antiguo 12/08/2009, 15:57
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Identificadores unicos en simplexml

RESUELTO!!

Gracias por la guia.

Finalmente, no hay que igualer la sentencia a una variable, sino ejecutar directamente la adjudicacion de valores.

[$resultado = // esto no va] $set->item(0)->getElementsByTagName($seccion)->item(0)->childNodes->item(0)->nodeValue=$nuevo_contenido;

Luego, grabar con la funcion save(), no con saveXML() porque esta ultima solo devuelve una forma xml, pero no la graba.

Queda asi:

$xml->save($archivo_xml);
  #15 (permalink)  
Antiguo 13/08/2009, 11:52
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Respuesta: Identificadores unicos en simplexml

Que bueno que lo solucionaste y gracias por publicar la solución

Saludos
__________________
Esteban Quintana
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:56.