Page 1 of 1

xmlIter doubt

Posted: Tue Jun 03, 2014 5:27 pm
by Wanderson
Hi, I have a xml search:

xmlNode := xmlIter:Find('xCpl')
Compl_Rem := xmlNode:cData

If not found xCpl in xml file my program hangs. How I can avoid this?

Thanks in advance.

Re: xmlIter doubt

Posted: Tue Jun 03, 2014 5:47 pm
by karinha
Wanderson, veja se este exemplo ajuda:

http://fivewin.com.br/index.php?/topic/ ... -xml-nf-e/

abs,

Re: xmlIter doubt

Posted: Tue Jun 03, 2014 6:42 pm
by Wanderson
karinha wrote:Wanderson, veja se este exemplo ajuda:

http://fivewin.com.br/index.php?/topic/ ... -xml-nf-e/

abs,
Olá karinha,

No meu caso eu já busco direto o nodo que quero do xml (preciso de alguns somente) o exemplo que vc mostrou ele vai pro início e vai lendo linha a linha, no meu caso dou um find direto, gostaria de interceptar o resultado pra ver se achou pq se não acha o nodo dá erro no xmlNode:cData.

Obrigado.
Wanderson.

Re: xmlIter doubt

Posted: Tue Jun 03, 2014 7:51 pm
by karinha
Algo assim Wanderson?

Code: Select all


#include "FiveWin.ch"
#include "fileio.ch"
#include "hbxml.ch"

FUNCTION Main()

   LOCAL hFile, cXml, cFileName:="TEST.XML"
   LOCAL xmlDoc, xmlIter , xmlNode, cNode, cAttrib, cValue, oCampo, oConteudo

   IF .NOT. FILE( cFileName )

      MsgInfo( "Arquivo Não Encontrado !!!","Atenção" ) // nome do arquivo

      cFileName := cGetFile( "XML File (*.Xml)|*.Xml|","Selecione arquivo XML da NFe ",curdir())

      IF .NOT. FILE( cFileName )

         RETURN NIL

      ENDIF

   ENDIF

   cNode   := NIL
   cAttrib := NIL
   cValue  := NIL
   hFile  := FOpen( cFileName )

   xmlDoc := TXmlDocument():New( hFile )

   IF xmlDoc:nStatus != HBXML_STATUS_OK

      Msginfo( "Erro ao Ler Arquivo .XML" )

      RETURN NIL

   ENDIF

   xmlIter := TXmlIterator():New( xmlDoc:oRoot )
   xmlNode := xmlIter:Find()

   DO WHILE xmlNode != NIL

      SYSREFRESH()

      IF .NOT. EMPTY( xmlNode:cData )

         IF SUBS( xmlNode:cData,1,1 ) # "<"

            oCampo    := xmlNode:cName

            oConteudo := xmlNode:cData

         ENDIF

      ELSE

        oCampo := xmlNode:cName

      ENDIF

      ? oCampo, oConteudo

      xmlNode := xmlIter:Next() // joga pro proximo campo

   ENDDO

RETURN NIL 
 
Abs

Re: xmlIter doubt

Posted: Wed Jun 04, 2014 4:52 pm
by Wanderson
Olá karinha obrigado pela resposta mas não é isso. No seu exemplo vc percorre o xml todo. Eu uso a opção do find que já vai pra primeira ocorrência que quero pesquisar, só que pode acontecer de não ter essa ocorrência no xml aí o quando faço xmlNode := xmlIter:Find('xCpl') e não acha dá erro na próxima linha que tem o cdata com o retorno. Teria que ter uma forma de testar o xmlNode pra ver se achou ou não a ocorrência procurada.

Re: xmlIter doubt

Posted: Wed Jun 04, 2014 5:07 pm
by karinha