Ler arquivo XML - Dúvidas

1,038 views
Skip to first unread message

sake

unread,
Mar 4, 2011, 9:19:46 AM3/4/11
to GUG Porto Alegre/Brasil
Bom dia pessoal,

Estou com um problema sério aqui... Não sei quase nada sobre leitura
XML...
No Help do Genexus tenho a seguinte exemplo sobre o XMLReader:

Exemplo XML:
<MEMBERS>
<MEMBER>Peter</MEMBER>
<MEMBER>Laura</MEMBER>
<MEMBER>John</MEMBER>
<MEMBER>Diana</MEMBER>
</MEMBERS>
<TASKS>
<TASK>
<PERSON_IN_CHARGE>Peter</PERSON_IN_CHARGE>
<![CDATA[ Write the application’s documentation]]>
</TASK>
<TASK>
< PERSON_IN_CHARGE >Diana</ PERSON_IN_CHARGE >
<![CDATA[ Meet with clients]]>
</TASK>
<TASK>
< PERSON_IN_CHARGE >Laura</ PERSON_IN_CHARGE >
<![CDATA[ Write user’s manual]]>
</TASK>
<TASK>
< PERSON_IN_CHARGE >John</ PERSON_IN_CHARGE >
<![CDATA[ Document the specifications]]>
</TASK>
</TASKS>
</MEETING>

E o exemplo do comando em Genexus:

&readfile.open(‘Meeting.xml’ )
&readfile.ReadType(1, 'MEMBERS')
&readfile.read()
do while &readfile.name <> 'MEMBERS'
&MEMBER = &readfile.value

&readfile.read()
enddo
&readfile.close()

Resultado da rotina:
Peter
Laura
John
Diana

O Comando "ReadType lê todo o arquivo até encontrar o nó
especificado(MEMBERS).

A minha dúvida é o seguinte:
XML:
<JOBS>
<JOB>MOTORISTA</JOB>
<JOB>CARTEIRO</JOB>
<JOB>ADVOGADO</JOB>
<JOB>ATOR</JOB>
</JOBS>

Comando Genexus:
&readfile.open(‘Meeting.xml’ )
&readfile.ReadType(1, 'MEMBERS')
&readfile.read()
do while &readfile.name <> 'MEMBERS'
&MEMBER = &readfile.value

&readfile.read()
enddo
&readfile.ReadType(1, 'JOBS')
&readfile.read()
do while &readfile.name <> 'JOBS'
&JOB = &readfile.value

&readfile.read()
enddo
&readfile.close()

O comando "&readfile.ReadType(1, 'MEMBERS')" não vai encontrar no XML
o nó "MEMBERS".
Pelo comando, ele vai no final do arquivo e, digamos, fica num looping
interminável...
Existe um comando onde possa ignorar e partir para o próximo
"&readfile.ReadType(1, 'JOBS')"????
Não gostaria de usar o comando Close() e logo em seguinda usar o
Open()...

Agradeço desde já...


Flávio

Tiago Oswald

unread,
Mar 9, 2011, 3:32:55 PM3/9/11
to gugportoal...@googlegroups.com
Flávio, você pode ler assim:


<JOBS>
<JOB>MOTORISTA</JOB>
<JOB>CARTEIRO</JOB>
<JOB>ADVOGADO</JOB>
<JOB>ATOR</JOB>
</JOBS>

O XmlReader navega por todos elementos XML, independente do seu nível, caso
do exemplo 5 elementos, sendo que os 4 elementos <JOB> estão dentro do
<JOBS>.
Para fazer este loop pelos elementos, use o metodo Read, este conforme
descrito na documentação, quando encontra um elemento retorna um valor maior
que zero e quando não encontra mais elementos retorna zero, logo, faça o
loop da seguinte forma.
No meu exemplo, transformei todo XML em uma única string, logo, vou usar o
"OpenFromString" mas se quiser gravar o XML em um arquivo texto e abrir o
arquivo é só indicar o local físico deste arquivo.

&XmlReader.OpenFromString("<JOBS><JOB>MOTORISTA</JOB><JOB>CARTEIRO</JOB><JOB
>ADVOGADO</JOB><JOB>ATOR</JOB></JOBS>") // Instanciamento da variável
XmlReader
Do While &XmlReader.Read() > 0 // Abertura do loop fazendo com que um loop
ocorra enquanto existir elementos
Do Case
Case &XmlReader.Name = "JOBS" // O valor do jobs não
enteressa
Case &XmlReader.Name = "JOB" //Quando o elemento lido foi um
"JOB"
&Job = &XmlReader.Value // Guarda o valor do JOB na
variável &Job
EndCase
EndDo // Fecha o loop, ou seja, o "&XmlReader.Read()" é zero
&XmlReader.Close()


-----Mensagem original-----
De: gugportoal...@googlegroups.com
[mailto:gugportoal...@googlegroups.com] Em nome de sake
Enviada em: sexta-feira, 4 de março de 2011 11:20
Para: GUG Porto Alegre/Brasil
Assunto: [gugportoalegrebrasil] Ler arquivo XML - Dúvidas

Bom dia pessoal,

Agradeço desde já...


Flávio

--
Você está recebendo esta mensagem porque se inscreveu no grupo "GUG Porto
Alegre/Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para
gugportoal...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para
gugportoalegrebr...@googlegroups.com.
Para obter mais opções, visite esse grupo em
http://groups.google.com/group/gugportoalegrebrasil?hl=pt-BR.

Flávio de Mogi

unread,
Mar 10, 2011, 7:02:21 AM3/10/11
to gugportoal...@googlegroups.com
Obrigado Tiago,
Irei fazer um teste com a sua idéia.
Acabei fazendo pelo modelo do Help do Genexus. Porém muito trabalhoso e repetitivo.
Irei fazer um com a sua sugestão.
Att,

Flávio

Tiago Oswald

unread,
Mar 10, 2011, 8:02:20 AM3/10/11
to gugportoal...@googlegroups.com

Sim Flávio, trabalhoso é.

Mas não tem como ser diferente, por que o loop terá que percorrer todos os elementos e por isso se torna confuso.

 

Abraço,

 

Tiago

AngrA

unread,
Mar 10, 2011, 11:49:37 AM3/10/11
to gugportoal...@googlegroups.com
Quando o XML é criado por mim, eu utilizo uma SDT que fica mais simples a gravação e recuperação das informações.
Crio a SDT com a estrutura que quero, converto a SDT em XML e grava em arquivo, e para ler para faço o processo inverso.

Diego Rodrigo,


2011/3/10 Tiago Oswald <tosw...@gmail.com>



--
-------------------------------
Diego Rodrigo

Reply all
Reply to author
Forward
0 new messages