Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

merlinus

[Resolvido] foreach com um unico resultado

Recommended Posts

Saudações, estou trablhando com uma aplicação que vai pegar valores num site, com a ajuda de vocês cheguei ao seguinte código:

 

$DOMDocument = new DOMDocument( '1.0', 'utf-8' );

$DOMDocument->preserveWhiteSpace = false;

$DOMDocument->loadHTML( file_get_contents( $Website ) );

$DOMXPath = new DOMXPath( $DOMDocument );

$i = 0;

 

 

        foreach( $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_DetalheFichaItem_ctl05_lblDescProd"]' ) as $Nodes ){
        foreach( $Nodes->childNodes as $Node ){
           $desc = str_replace( ':', null, utf8_decode($Node->parentNode->parentNode->parentNode->getElementsByTagName( 'span' )->item( 0 )->nodeValue) );
                     }
         $i++;
     }
  echo "descrição: $desc";

 

Funciona perfeitamente, mas estava pensando, esse codigo ele vai sempre retornar um unico resultado (que é o que eu quero) não teria como fazer sem o foreach? eu não estaria gastando recurso a toa fazendo um loop desnecessario?

Compartilhar este post


Link para o post
Compartilhar em outros sites

se só retorna um resultado não..., não está gastando recurso não...

mas se você preferir pode trocar o foreach por

$Nodes = $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_DetalheFichaItem_ctl05_lblDescProd"]' )[0];

e

$Node = $Nodes->childNodes[0];

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado, se posso atazanar com mais uma duvida,

 

tenho uma outra query que seria assim:

query( './/table/tr/td/span[@id=ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza1]' )

 

essa sim vai entrar dentro do foreach, mas o 1 no final vai variar de 1 a 3, tem como eu substituir o 1 por um caracter curinga? algo como:

query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza[1-9]"]' )

 

esse exemplo já tentei e vi que não deu certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$Nodes = $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_DetalheFichaItem_ctl05_lblDescProd"]' )[0];

Isso não existe amigo, o método query do DOMXPath não retorna um array, mas sim uma coleção de itens que pode ser iterada.

 

merlinus, você pode usar um contains, concat, e translate, funções nativas do xpath, tente assim:

query( './/table/tr/td/span[ 
   contains( @id, 
          translate( "ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza", "0123456789", "" ) ) 
]' )

 

Ou então, pra apelar mais ainda.

query( './/table/tr/td/span[ 
  starts-with( @id, "ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza" )
  and translate( @id, "0123456789", "" )
]' )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando penso que estou pegando o jeito a viagem aumenta, esse deveria dom se chamar doom viu... mas um dia eu chego lá.

 

Então tenho que sempre manter dentro dos foreach?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, isso depende de cada retorno da query, se você tem filhos no elemento. você pode percorer todos eles usando childNodes com foreach, se você tem apenas um elemento retornado, você pode usar:

$DOMXPath->query( '...' )->item( 0 )-> ...

 

Depende da situação amigo, enfim. deu certo aí ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pior que não, estava tentando fazer uns testes que acho que o erro mas está assim:

 

               foreach( $DOMXPath->query( './/table/tr/td/span[@id="ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza1"]' ) as $Nodes ){
        foreach( $Nodes->childNodes as $Node ){

           $nat[$i] = utf8_decode( $Node->nodeValue );
                     }
         $i++;
     }

              print_r( $nat );

 

dai sai o resultado do final 1, quando substituo com a sua query:

 

               foreach( $DOMXPath->queryquery( './/table/tr/td/span[
  starts-with( @id, "ctl00_ContentPlaceHolder1_WUC_FichaItem1_lblNatureza" )
  and translate( @id, "0123456789", "" ) as $Nodes ){
        foreach( $Nodes->childNodes as $Node ){

           $nat[$i] = utf8_decode( $Node->nodeValue );
                     }
         $i++;
     }

              print_r( $nat );

dá erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

:huh:

:ermm:

:o

:!:

:lol:

 

Neh, isso que dar programar e atender fila ao mesmo tempo.

 

Agora está funcionando perfeitamente.

 

VLW.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.