Foros del Web » Programando para Internet » PHP »

como puedo hacer un conteo en xml a partir de un atributo??

Estas en el tema de como puedo hacer un conteo en xml a partir de un atributo?? en el foro de PHP en Foros del Web. Buenas a todos, tengo un xml que parseo desde php y tiene la siguiente estructutura: Como observan, existe un atributo llamado codparam que es que ...
  #1 (permalink)  
Antiguo 29/08/2011, 16:23
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
como puedo hacer un conteo en xml a partir de un atributo??

Buenas a todos, tengo un xml que parseo desde php y tiene la siguiente estructutura:



Como observan, existe un atributo llamado codparam que es que que me diferencia los tipos de evolución...

Para leer el xml, hago lo siguiente:

Código PHP:
Ver original
  1. $x = new SimpleXMLElement($archivo, null, true);
  2.  
  3. foreach( $x->evolucion as $evolucion )
  4. {
  5. $codparam=$evolucion['codparam'];
  6. $elemento=$evolucion->elemento;
  7. $descripcion=$evolucion->descripcion;
  8.  
  9. }
Habia creado una variable bandera para definir en que momento, el valor del atributo codparam cambiaba, y eso me funciono pero lo que realmente necesito saber es cuantas etiquetae evolucion existen para cada codparam

Es decir que me diga para codparam=7 hay 3 evoluciones
y para codparam=8 hay 2 evoluciones

Como podria hacerlo?..agradezco me puedan indicar muchas gracias
  #2 (permalink)  
Antiguo 29/08/2011, 17:02
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

olvide algo, por si alguien le parece conveniente:

el archivo xml

http://dl.dropbox.com/u/9463718/epic...724_164941.xml

y el codigo php

http://dl.dropbox.com/u/9463718/parseoxml.php
  #3 (permalink)  
Antiguo 29/08/2011, 17:18
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Es que no veo el problema oscarbt , ya lo tienes practicamente resuelto, si guardas en un array que tenga por clave el codparam y sumas 1 en cada ocurrencia no te sirve ?, un ejemplo con DOM

Código PHP:
Ver original
  1. $doc = DOMDocument::loadXML($xml);
  2. $results = array();
  3. foreach ($doc->getElementsByTagName('evolucion') as $node) {
  4.     $code = $node->getAttribute('codparam');
  5.     !isset($results[$code]) ? $results[$code] = 1 : $results[$code]++;
  6. }
  7. print_r($results);

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 29/08/2011, 17:43
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Realment el problema es que cuando yo agrego una nueva etiqueta de evolución, esta siempre se agrega de ultimas, entonces el orden del atributo codparam se pierde...
En otras palabras, requiero que se muestren los datos de acuerdo al valor de codparam, entonces primero irian los de codparam 7, luego los de codparam8 y asi sucesivamente, ese es mi problema.....Me surge una inquietud, existe alguna forma de ordenar lo que voy a mostrar en un xml?¡..algo asi como un ORDER BY?....
  #5 (permalink)  
Antiguo 29/08/2011, 18:14
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

El orden es de acuerdo al codparam ? o de acuerdo al codparam que tenga mas elementos ?, en cualquier caso lo puedes hacer desde PHP, un ejemplo(ordenado por el segundo caso):

Código PHP:
Ver original
  1. $doc = DOMDocument::loadXML($xml);
  2.  
  3. $results = array();
  4. foreach ($doc->getElementsByTagName('evolucion') as $node) {
  5.     $results[$node->getAttribute('codparam')][] = $node;
  6. }
  7.  
  8. uasort($results, function($a, $b){
  9.     $a = count($a);
  10.     $b = count($b);
  11.     return $a == $b ? 0 : $a > $b ? -1 : 1;
  12. });
  13.  
  14. print_r($results);

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #6 (permalink)  
Antiguo 29/08/2011, 18:17
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Si, el orden es de acuerdo a codparam, de menor a mayor codigo, es decir, empezaria el 7...de esa forma, en el momento de ir agregando nuevas etiqeutas evolucion, se verian en orden?...en estos momentos no tengo como probarlo, me toca mañana.....pruebo y te cuento ...Muchas gracias...
  #7 (permalink)  
Antiguo 29/08/2011, 18:31
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Ordenado usando SimpleXML según codparam:

Código PHP:
Ver original
  1. <?php
  2. $x = new SimpleXMLElement($xml, null, true);
  3. $evoluciones = $x->xpath('/epicrisis/evolucion');
  4. usort($evoluciones, function($t1, $t2) {
  5.     return strcmp($t1['codparam'], $t2['codparam']);
  6. });
  7. foreach ($evoluciones as $evolucion) {
  8.     echo $evolucion->nomparam;
  9.     //Aqui ya estan todos ordenados, aplica lo que tienes hecho
  10.    //...
  11. }
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #8 (permalink)  
Antiguo 30/08/2011, 05:19
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Ahí te mostró andresdzphp el otro orden aunque no entiendo el xpath para algo tan sencillo, otra opción es utilizar xslt, por ejemplo si quisieras crear una tabla que liste ordenado por codparam y elemento, podrias hacer algo asi:

style.xsl
Código XML:
Ver original
  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:output method="html" encoding="UTF-8"/>
  4. <xsl:template match="/">
  5. <table>
  6.  <thead>
  7.    <tr>
  8.      <th>codparam</th>
  9.      <th>element</th>
  10.    </tr>
  11.  </thead>
  12.  <tbody>
  13.    <xsl:for-each select="//evolucion">
  14.      <xsl:sort select="@codparam" />
  15.      <xsl:sort select="elemento" />
  16.    <tr>    
  17.      <td><xsl:value-of select="@codparam" /></td>  
  18.      <td><xsl:value-of select="elemento" /></td>
  19.    </tr>
  20.   </xsl:for-each>
  21.  </tbody>
  22. </table>
  23. </xsl:template>
  24. </xsl:stylesheet>


Código PHP:
Ver original
  1. $xml = DOMDocument::loadXML($xml);
  2.  
  3. $xslt = new XSLTProcessor();
  4. $xsl  = new DOMDocument();
  5. $xsl->load('style.xsl', LIBXML_NOCDATA);
  6. $xslt->importStylesheet($xsl);
  7.  
  8. echo $xslt->transformToXML($xml);

este approach tiene dos problemas, primero hay que manejar xslt, y segundo la extensión tiene que estar habilitada y no siempre es así.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 30/08/2011, 06:24
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Bueno muchas gracias, andrezdzphp me ha salido un error en el codigo y realmente no he podido corregirlo, en la imagen se ve el error:



y en cuanto al codigo de masterpuppet, me esta saliendo tambien un error:




Pues realmente esas funciones no las habia trabajado.....espero me puedan orientar a que se debe el error....Gracias
  #10 (permalink)  
Antiguo 30/08/2011, 12:14
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Según ese error estas copiando el código de ver original, copialo directamente. Yo soy de los que pruebo todo lo que pongo, así que error de sintaxis no tiene, tampoco sé que versión de PHP estás usando...

Sobre lo que dices masterpuppet, es mejor usar un método sencillo o recorrer todos con un bucle como vos lo hiciste? Ya me aclararás ese punto ya que no soy experto.

Prueba este código así no le des en ver original que se te meten caracteres extraños usados en la tabulación del código en el foro.

Código PHP:
Ver original
  1. <?php
  2. $xml = 'http://dl.dropbox.com/u/9463718/epicrisis_0000700724_164941.xml';
  3. $x = new SimpleXMLElement($xml, null, true);
  4.  
  5. $evoluciones = $x->xpath('/epicrisis/evolucion');
  6.  
  7. function ordenar ($t1, $t2) {
  8.     return strcmp($t1['codparam'], $t2['codparam']);
  9. }
  10.  
  11. usort($evoluciones, 'ordenar');
  12. foreach ($evoluciones as $evolucion) {
  13.     echo $evolucion->nomparam;
  14.     //Aqui ya estan todos ordenados, aplica lo que tienes hecho
  15. }

Me gusta más lo último que te dejó masterpuppet, no creo que las otras formas sean muy eficiente con un archivo muy grande. Saludos
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP

Última edición por andresdzphp; 30/08/2011 a las 12:34
  #11 (permalink)  
Antiguo 30/08/2011, 14:37
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

@andresdzphp como tu lo hiciste es la forma correcta con SimpleXMLElement, al no utilizar SimpleXMLElement asumí() que tendria algo paracido a DOMDocument::getElementsByTagName pero no es el caso.

Y que es mejor depende de la situación, pero creo que como lo has planteado tu es lo mejor en la mayoria de los casos. XSLT no siempre es una opción(yo lo tuve que activar en local).

@oscarbt, los ejemplos que te dejamos utilizan Closures, y estan disponibles a partir de PHP 5.3+, con el último ejemplo de andresdzphp deberia funcionar sin problemas.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #12 (permalink)  
Antiguo 31/08/2011, 12:34
 
Fecha de Ingreso: abril-2009
Ubicación: Colombia
Mensajes: 949
Antigüedad: 15 años
Puntos: 27
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Buenos pues ya logre solucionarlo, muchas gracias a los dos......
  #13 (permalink)  
Antiguo 19/09/2011, 07:20
Avatar de gachon  
Fecha de Ingreso: septiembre-2004
Ubicación: En Google
Mensajes: 462
Antigüedad: 19 años, 7 meses
Puntos: 3
Respuesta: como puedo hacer un conteo en xml a partir de un atributo??

Gracias, muy buenas explicaciones

Etiquetas: conteo, xml, variables
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 20:42.