Página 1 de 1

Troca de tags

Enviado: 05 Jun 2012 11:10
por Adelson.p
Bom dia :D

quero saber, como posso fazer troca de algumas tags, q estão dentro de alguns nós específicos, por exemplo:

Código: Selecionar todos

<noh id="1">
    <tag1>valor1</tag1>
    <tag2>valor2</tag2>
    <tag3>valor3</tag3>
    <tag4>valor4</tag4>
</noh>

<noh id="2">
    <tag1>valor1</tag1>
    <tag2>valor2</tag2>
    <tag3>valor3</tag3>
    <tag4>valor4</tag4>
</noh>
e eu quero fazer uma busca no XML, e fazer uma troca do valor da TAG 3 do nó de ID 2
Estou usando o xHarbour, mas, o meu código nao esta funcionando, tentei utilizar o substr, mas, minha idéia nao funcionou.

Agradeço a Ajuda

Troca de tags

Enviado: 05 Jun 2012 13:47
por Imatech
Boa tarde !

Desculpe não lhe responder objetivamente...

Primeiro peço que estude os exemplos da pasta contrib do Harbour:
Ex:
\Harbour\contrib\xhb\tests\exemplos com xml

...


Após estará apto para manipular os dados que necessita... e poderá voltar e perguntar sobre outras duvidas sobre o como realizar essa tarefa...



Felicidades...

Troca de tags

Enviado: 05 Jun 2012 14:45
por Adelson.p
Boa tarde.
Aquele exemplo, da leitura do xml, q tem os livros.. eu jah conheço muito bem, eu já consegui fazer a parte onde ele encontra tudo o local onde está e tudo mais, mas o meu problema, é na hora de fazer a troca, pois eu nao consigo fazer a troca da linha onde está a tag, por uma outra linha, com o novo valor.

Troca de tags

Enviado: 05 Jun 2012 17:10
por Imatech
Blz... então já esta apto a manipular o XML utilizando das funções disponiveis...


1º Ler o XML completo (já atribuir o novo conteudo para a: tag3 quando encontrar o id = 2)...

Abaixo um pequeno esboço do que vai precisar...

Código: Selecionar todos


  LOCAL oDoc, oBook, oIterator, oCurrent
  LOCAL l_Condicao := .T.

  oDoc := TXmlDocument():New( MemoRead( c_Nome_do_Arquivo_XML ), HBXML_STYLE_NOESCAPE )
  oBook := oDoc:findfirst( "id" )
  oIterator := TXmlIterator():New( oBook )
  oCurrent := oIterator:Next()
  etc...
  If oCurrent:cName == 'id' .and oCurrent:cData == '2'
    etc... continua leitura
    If oCurrent:cName == 'tag3' 
      // pronto... atribui sua mudança...
      oCurrent:cData := c_Novo_Conteudo...
    endif
  endif
  etc...
  Grava XML com novo nome (ou substitui o existente)...

*** Adicionar os Loop's para a leitura de cada nivel (node) do XML



Sucesso...

Troca de tags

Enviado: 05 Jun 2012 17:18
por Adelson.p
Certo, e para salvar esse novo XML, eu faço de que forma essa conversão ?

Código: Selecionar todos

oDoc:toString( ) ?
Mas, como eu faria para salvar com a nova informação ?

Troca de tags

Enviado: 05 Jun 2012 17:25
por Imatech

Código: Selecionar todos


  LOCAL xAux := ''
  LOCAL nFileHandle := FCreate( c_Nome_a_salvar_xml )

  ...
  Leitura e tratamento do XML
  ...

  xAux := oDoc:write( nFileHandle, HBXML_STYLE_INDENT )
  xAux := FClose( nFileHandle )


Troca de tags

Enviado: 05 Jun 2012 17:40
por Adelson.p
Bom, fiz a busca aqui, mas ele tah trocando só o do ID numero e nao a de numero 2 :/
quando eu depurei, ele só fez a alteração, quando ele chegou no nó de id 3 ;x

Troca de tags

Enviado: 05 Jun 2012 17:46
por Adelson.p
Hummmmmmmm
Certo, encontrei meu erro....
Bom, pelo que eu notei, ele faz a contagem certinho dos ID's, mas, quando ele começa a verificar as TAGS, ele começa do ID 1 e nao do ID 3, como posso fazer para corrigir isso ?

Troca de tags

Enviado: 05 Jun 2012 17:53
por Adelson.p
Certo, ja consegui arrumar (:
Agora está funcionando certinho, muito obrigado (:

Troca de tags

Enviado: 05 Jun 2012 18:20
por Imatech
Isso ai... :)

Só faltavam os loop´'s


Sucesso...