Foros del Web » Programando para Internet » PHP »

simplexml como buscar nodo hijo especifico

Estas en el tema de simplexml como buscar nodo hijo especifico en el foro de PHP en Foros del Web. Hola a todos, teniendo la estructura. Código PHP: < a >    < b >       < c >       </ c >    </ b > </ a ...
  #1 (permalink)  
Antiguo 02/09/2010, 10:40
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 13 años, 11 meses
Puntos: 35
simplexml como buscar nodo hijo especifico

Hola a todos,
teniendo la estructura.
Código PHP:
<a>
   <
b>
      <
c>
      </
c>
   </
b>
</
a>
<
a>
   <
b>
      <
c>
      </
c>
   </
b>
</
a
mediante un bucle, recorro el xml. Como en este diagrama tengo 2 nodos padres (a), se ejecuta el bucle 2 veces.
Yo tengo que acceder a un nodo hijo especifico en cada bucle, digamos el nodo C.
Pero no siempre poseerá esa estructura. quizas haya mas nodos, en medio.
Como puedo hacerlo, usando xpath, para acceder al nodo C?

Se entiende?
__________________
I am Doyle please insert code.

Última edición por doylelives; 02/09/2010 a las 11:06
  #2 (permalink)  
Antiguo 02/09/2010, 14:05
 
Fecha de Ingreso: enero-2010
Mensajes: 191
Antigüedad: 12 años, 4 meses
Puntos: 7
Respuesta: simplexml como buscar nodo hijo especifico

Código PHP:
$nodes->xpath('//c'); 
Chan!
  #3 (permalink)  
Antiguo 02/09/2010, 15:20
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 13 años, 11 meses
Puntos: 35
Respuesta: simplexml como buscar nodo hijo especifico

pero eso me devuelve el conjunto de todos los nodos c, repitiendose en cada bucle.
Yo quiero que cuando buclea cada nodo A, acceda al nodo C de ESE nodo A.
__________________
I am Doyle please insert code.
  #4 (permalink)  
Antiguo 03/09/2010, 07:00
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 13 años
Puntos: 1517
Respuesta: simplexml como buscar nodo hijo especifico

Lo que sucede es que tienes que especificar algún atributo para que lo haga único. Por ejemplo
Código PHP:
Ver original
  1. <?php
  2. $string = <<<XML
  3. <foo>
  4.     <a id="1">
  5.        <b>
  6.           <c>foo</c>
  7.        </b>
  8.     </a>
  9.     <a id="2">
  10.        <b>
  11.           <c>bar</c>
  12.        </b>
  13.     </a>
  14. </foo>
  15. XML;
  16.  
  17. $xml = new SimpleXMLElement($string);
  18.  
  19. $id = 1;
  20. $result = $xml->xpath('//a[@id="' . $id . '"]/b/c');
  21. var_dump($result);
De esa forma puedes obtener el que quieras específicamente.

Edito:
También puedes usar condiciones. Por ejemplo, voy a tomar aquella etiqueta de <c> que tenga como valor foo y retonar el pariente <a> con toda su estructura
Código PHP:
Ver original
  1. <?php
  2. $string = <<<XML
  3. <foo>
  4.     <a id="1">
  5.         <b>
  6.             <c>foo</c>
  7.         </b>
  8.         <d>
  9.             <e>candy</e>
  10.         </d>
  11.     </a>
  12.     <a id="2">
  13.         <b>
  14.             <c>bar</c>
  15.         </b>
  16.     </a>
  17. </foo>
  18. XML;
  19.  
  20. $xml = new SimpleXMLElement($string);
  21.  
  22. $result = $xml->xpath('//c[.="foo"]/ancestor::a');
  23. var_dump($result);
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 03/09/2010 a las 07:32
  #5 (permalink)  
Antiguo 03/09/2010, 07:50
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 13 años, 11 meses
Puntos: 35
Respuesta: simplexml como buscar nodo hijo especifico

digamos que tengo 2 valores a capturar, de los nodos c1 y c2, desconozco sus contenidos.
Código PHP:
<foo>
    <
a id="1">
       <
b>
          <
c1>foo1</c1>
          <
c2>foo2</c2>
       </
b>
    </
a>
    <
a id="2">
       <
b>
          <
c1>bar1</c1>
          <
c2>bar2</c2>
       </
b>
    </
a>
</
foo>
foreach (
$this->xml as $key => $value ) {
     
//yo sé que esto itera sobre los nodos A

Facilmente podria hacer $value->b->c1 o $value->b->c2 y acceder al contenido.
Sin embargo a futuro se podrian agregar nodos en el medio. Debiendo modificar ese codigo. Pero si puedo asegurar que el nodo C permanecera en el futuro
¿No podria en $value-> usar un xpath para acceder al nodo C, desde A directamente, sin deber conoce la ruta absoluta? (A->b->C)
Gracias!
__________________
I am Doyle please insert code.
  #6 (permalink)  
Antiguo 03/09/2010, 07:54
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 13 años
Puntos: 1517
Respuesta: simplexml como buscar nodo hijo especifico

Sí es posible. Mira este ejemplo
Código PHP:
Ver original
  1. <?php
  2. $string = <<<XML
  3. <foo>
  4.     <a id="1">
  5.         <b>
  6.             <d>
  7.                 <c>foo</c>
  8.             </d>
  9.         </b>
  10.     </a>
  11.     <a id="2">
  12.         <b>
  13.             <c>bar</c>
  14.         </b>
  15.     </a>
  16. </foo>
  17. XML;
  18.  
  19. $xml = new SimpleXMLElement($string);
  20.  
  21. $id = 1;
  22. $result = $xml->xpath('//a[@id="' . $id . '"]//c');
  23. var_dump($result);
  24. echo '<br />';
  25. $result = $xml->xpath('//c');
  26. var_dump($result);
Te recomiendo que leas este material para que te puedas desenvolver http://www.w3schools.com/xpath/default.asp
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 03/09/2010 a las 08:02
  #7 (permalink)  
Antiguo 03/09/2010, 09:23
 
Fecha de Ingreso: junio-2008
Ubicación: Capital Federal xD
Mensajes: 1.208
Antigüedad: 13 años, 11 meses
Puntos: 35
Respuesta: simplexml como buscar nodo hijo especifico

buena info, lo leeré con detenimiento.
gracias!!
__________________
I am Doyle please insert code.

Etiquetas: especifico, nodo, simplexml
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 00:58.