PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 25 → Wx - Leitura de arquivos XML com um Registro e Multiplos registros, Extração das Tag e dos Valores de cada Tag para uso em seus sistemas
Wx - Leitura de arquivos XML com um Registro e Multiplos registros, Extração das Tag e dos Valores de cada Tag para uso em seus sistemas
Iniciado por adrianoboller, jan., 15 2016 9:29 PM - 11 respostas
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:29 PM
Boa tarde Prezados,

Segue 3 vídeo aulas para estudo de arquivo xml para ler xml no Android e no iOS

http://www.screencast.com/t/sPyLGnKxfa

http://www.screencast.com/t/6C4OCWcW

http://www.screencast.com/t/V0APuTWU

os fontes estão no fórum oficial

Estou passando o exemplo para a PcSoft corrigir a função arraydeleteduplicate( ) que esqueceram de fazer para o Android que dei o nome de ArrayDeleteDuplicateBoller( ). E o Pega Nó do Xml que dei o nome de PegaNoXml( )

Bons estudos, espero ter esclarecido como se trabalha com xml nas duas plataformas.

Caso alguém tenha ficado com dúvida entre em contato

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:29 PM
//Global do Projeto
arrXml_Tags is array of strings //Nome das Tags

arrXml_TagResult is array of strings //Conteudo das Tags Resultado


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:30 PM
Procedure LocalizarTagsEmXml(XML_Retorno is string)

//Variaveis
nXposicaoinicial is int = 0
nXposicaofinal is int = 0
arrXml_Tag is array of strings

X is int = 0

//Exemplo
//<Xml>
//<Retorno>
//<NoXml ID="3"> // <------------------------ motivo do erro
//<login_id>3</login_id>
//<login_email>teste@teste.com</login_email>
//<login_nome>Usuario teste</login_nome>
//<login_senha>123</login_senha>
//<login_status>1</login_status>
//<login_admin>0</login_admin>
//</NoXml> // <------------------------ motivo do erro
//<Total>1</Total>
//</Retorno>
//</Xml>


//iOS - Apple (iPhone / iPad / iPod)
IF IniOSMode() = True THEN

NoXml is string
i is int = 1
NoXml = XMLExtractString(XML_Retorno,"NoXml",i)

Add(arrXml_Tag,"login_id")
Add(arrXml_Tag,"login_email")
Add(arrXml_Tag,"login_nome")
Add(arrXml_Tag,"login_senha")
Add(arrXml_Tag,"login_status")
Add(arrXml_Tag,"login_admin")

FOR EACH stag OF arrXml_Tag

temp is string = XMLExtractString(NoXml,stag)
Add(arrXml_TagResult, temp )

END

//Android
ELSE IF InAndroidMode() = True

XmlDoc is XMLDocument
XmlDoc = XMLOpen(XML_Retorno, fromString)
NoXml is xmlNode

FOR EACH NoXml OF XmlDoc.Xml.Retorno on NoXml

Add(arrXml_TagResult, NoXml.login_id)
Add(arrXml_TagResult, NoXml.login_email)
Add(arrXml_TagResult, NoXml.login_nome)
Add(arrXml_TagResult, NoXml.login_senha)
Add(arrXml_TagResult, NoXml.login_status)
Add(arrXml_TagResult, NoXml.login_admin)

END

END

RESULT arrXml_TagResult


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:32 PM
//Exemplo 2
Procedure LocalizarTagsEmXml(XML_Retorno is string)

//Variaveis
nXposicaoinicial is int = 0
nXposicaofinal is int = 0
arrXml_Tag is array of strings

X is int = 0

//Exemplo
//<Xml>
//<Retorno>
//<NoXml ID="3"> // <------------------------ motivo do erro deve ser um nome para todas as consultas nao mude NoXml
//<login_id>3</login_id>
//<login_email>teste@teste.com</login_email>
//<login_nome>Usuario teste</login_nome>
//<login_senha>123</login_senha>
//<login_status>1</login_status>
//<login_admin>0</login_admin>
//</NoXml> // <------------------------ motivo do erro deve ser um nome para todas as consultas nao mude NoXml
//<Total>1</Total>
//</Retorno>
//</Xml>


//iOS - Apple (iPhone / iPad / iPod)
IF IniOSMode() = True THEN

NoXml is string
i is int = 1
NoXml = XMLExtractString(XML_Retorno,"NoXml",i)

Add(arrXml_Tag,"login_id")
Add(arrXml_Tag,"login_email")
Add(arrXml_Tag,"login_nome")
Add(arrXml_Tag,"login_senha")
Add(arrXml_Tag,"login_status")
Add(arrXml_Tag,"login_admin")

XmlDoc is XMLDocument

XmlDoc = XMLOpen(XML_Retorno, fromString)

total is int = XMLExtractString(XML_Retorno,"Total") //5

LOOP (total)

FOR EACH stag OF arrXml_Tag on stag

temp is string = XMLExtractString(NoXml,stag)
Add(arrXml_TagResult, temp )

END

END

//Android
ELSE IF InAndroidMode() = True

XmlDoc is XMLDocument
XmlDoc = XMLOpen(XML_Retorno, fromString)
NoXml is xmlNode

FOR EACH NoXml OF XmlDoc.Xml.Retorno on NoXml

Add(arrXml_TagResult, NoXml.login_id)
Add(arrXml_TagResult, NoXml.login_email)
Add(arrXml_TagResult, NoXml.login_nome)
Add(arrXml_TagResult, NoXml.login_senha)
Add(arrXml_TagResult, NoXml.login_status)
Add(arrXml_TagResult, NoXml.login_admin)

END

END

RESULT arrXml_TagResult


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:34 PM
//Exemplo 3

Procedure ArrayDeleteDuplicateBoller(ArrayResultado is array of strings)

x, NaoAchou is int = 0

ArrayResultadoNovo is array of strings

nTotal is int = ArrayCount(ArrayResultado)

LOOP (nTotal)

x += 1

NaoAchou = ArraySeek(ArrayResultadoNovo,asLinearFirst,ArrayResultado[x])

IF NaoAchou = -1

Add(ArrayResultadoNovo,ArrayResultado[x])

END

END

RESULT (ArrayResultadoNovo)


outra procedure

Procedure IdentificarTagsNoXml(XmlConteudo)

x, Inicial, Final, Tamanho is int = 0

Tag, Anterior is string = ""

IF XmlConteudo <> "" THEN

XmlConteudo = NoAccent(XmlConteudo)
XmlConteudo = Replace(XmlConteudo,CR,"")
XmlConteudo = Replace(XmlConteudo,Charact(13),"")
XmlConteudo = Replace(XmlConteudo,Charact(10),"")

Total is int = Length(XmlConteudo)

LOOP (Total)

x += 1

IF XmlConteudo[[x]] = "<"
Inicial = x+1
ELSE IF XmlConteudo[[x]] = ">"
Final = x
IF Final <= Inicial THEN
Final = 0
END
END

IF Inicial > 0 AND Final > 0 AND Final > Inicial

Tamanho = Final - Inicial

Tag = Middle(XmlConteudo,Inicial,Tamanho)

//IGNORAR AS TAGS DE FECHAMENTO E ID
IF Middle(Tag,1,1) = "/" OR PositionOccurrence(Upper(Tag),"ID=",firstRank,FromBeginning) > 0
Tag = ""
END

//VALIDA TAGS DO NÓ
IF Tag <> "" AND Tamanho > 0 AND Anterior <> Tag AND Upper(Tag) <> "XML" AND Upper(Tag) <> "RETORNO" AND Upper(Tag) <> "TOTAL"

Anterior = Tag

//DEBUG
//add(arrXml_Tags,Tag +" / "+ Inicial +" / "+ Final +" / "+ Tamanho )
//INFO(TAG)

Add(arrXml_Tags,Tag) //VAR GLOBAL: arrXml_Tags

END

END

END

END

//TARGET CODE
ArrayDeleteDuplicate(arrXml_Tags,tccIgnoreSpace)


//TARGET CODE


outra procedure

Procedure LocalizarTagsEmXml(XML_Retorno is string)

//Variaveis
nXposicaoinicial is int = 0
nXposicaofinal is int = 0

X is int = 0

//Exemplo
//<Xml>
//<Retorno>
//<NoXml ID="3"> // <------------------------ motivo do erro
//<login_id>3</login_id>
//<login_email>teste@teste.com</login_email>
//<login_nome>Usuario teste</login_nome>
//<login_senha>123</login_senha>
//<login_status>1</login_status>
//<login_admin>0</login_admin>
//</NoXml> // <------------------------ motivo do erro
//<Total>1</Total>
//</Retorno>
//</Xml>


//iOS - Apple (iPhone / iPad / iPod)
IF IniOSMode() = True THEN

NoXml is string
i is int = 1
NoXml = XMLExtractString(XML_Retorno,"NoXml",i)

//FUNCAO IDENTIFICA TAG
IdentificarTagsNoXml(XML_Retorno)

FOR EACH stag OF arrXml_Tags //VAR GLOBAL

temp is string = XMLExtractString(NoXml,stag)

Add(arrXml_TagResult, temp )

END

//Android
ELSE IF InAndroidMode() = True

T is int = 0

IdentificarTagsNoXml(XML_Retorno) //FUNCAO IDENTIFICA TAG

nQtde_tags is int = ArrayCount(arrXml_Tags)
TagRegistro is string
TagValor is string

LOOP (nQtde_tags)

T += 1

TagRegistro = arrXml_Tags[T]

TagValor = XMLExtractString(XML_Retorno,TagRegistro)

IF TagValor <> ""

Add(arrXml_TagResult,TagValor)

END

END


END

RESULT arrXml_TagResult


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
123 mensagems
Popularité : +46 (46 votes)
Publicado em janeiro, 15 2016 - 9:36 PM
Muito Bom Adriano Show De bola

--
Atte. Willian Fernando
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:37 PM
//Exemplo 4 do video

Procedure ArrayDeleteDuplicateBoller(ArrayResultado is array of strings)

x, NaoAchou is int = 0

ArrayResultadoNovo is array of strings

nTotal is int = ArrayCount(ArrayResultado)

LOOP (nTotal)

x += 1

NaoAchou = ArraySeek(ArrayResultadoNovo,asLinearFirst,ArrayResultado[x])

IF NaoAchou = -1

Add(ArrayResultadoNovo,ArrayResultado[x])

END

END

RESULT (ArrayResultadoNovo)


outra procedure

Procedure IdentificarTagsNoXml(XmlConteudo)

x, Inicial, Final, Tamanho is int = 0

Tag, Anterior is string = ""

IF XmlConteudo <> "" THEN

XmlConteudo = NoAccent(XmlConteudo)
XmlConteudo = Replace(XmlConteudo,CR,"")
XmlConteudo = Replace(XmlConteudo,Charact(13),"")
XmlConteudo = Replace(XmlConteudo,Charact(10),"")

Total is int = Length(XmlConteudo)

LOOP (Total)

x += 1

IF XmlConteudo[[x]] = "<"
Inicial = x+1
ELSE IF XmlConteudo[[x]] = ">"
Final = x
IF Final <= Inicial THEN
Final = 0
END
END

IF Inicial > 0 AND Final > 0 AND Final > Inicial

Tamanho = Final - Inicial

Tag = Middle(XmlConteudo,Inicial,Tamanho)

//IGNORAR AS TAGS DE FECHAMENTO E ID
IF Middle(Tag,1,1) = "/" OR PositionOccurrence(Upper(Tag),"ID=",firstRank,FromBeginning) > 0
Tag = ""
END

//VALIDA TAGS DO NÓ
IF Tag <> "" AND Tamanho > 0 AND Anterior <> Tag AND Upper(Tag) <> "XML" AND Upper(Tag) <> "RETORNO" AND Upper(Tag) <> "TOTAL"

Anterior = Tag

//DEBUG
//add(arrXml_Tags,Tag +" / "+ Inicial +" / "+ Final +" / "+ Tamanho )
//INFO(TAG)

Add(arrXml_Tags,Tag) //VAR GLOBAL: arrXml_Tags

END

END

END

END

//TARGET CODE
ArrayDeleteDuplicate(arrXml_Tags,tccIgnoreSpace)


//TARGET CODE


Outra Procedure

Procedure LocalizarTagsEmXml(XML_Retorno is string)

//Variaveis
nXposicaoinicial is int = 0
nXposicaofinal is int = 0

X is int = 0

//Exemplo
//<Xml>
//<Retorno>
//<NoXml ID="3"> // <------------------------ motivo do erro
//<login_id>3</login_id>
//<login_email>teste@teste.com</login_email>
//<login_nome>Usuario teste</login_nome>
//<login_senha>123</login_senha>
//<login_status>1</login_status>
//<login_admin>0</login_admin>
//</NoXml> // <------------------------ motivo do erro
//<Total>1</Total>
//</Retorno>
//</Xml>


//iOS - Apple (iPhone / iPad / iPod)
IF IniOSMode() = True THEN

T, N is int = 0

RegistroXml is string

NoXml is string

i is int = 1

NoXml = XMLExtractString(XML_Retorno,"NoXml",i)

//FUNCAO IDENTIFICA TAG
IdentificarTagsNoXml(XML_Retorno)

nQtde_Registros is int = XMLExtractString(EDT_XML,"Total") //5

LOOP (nQtde_Registros)

T = 0

N += 1

RegistroXml = PegaNoXml(XML_Retorno,N)

NoXml = XMLExtractString(RegistroXml,"NoXml",i)

FOR EACH stag OF arrXml_Tags //VAR GLOBAL

temp is string = XMLExtractString(NoXml,stag)

Add(arrXml_TagResult, temp )

END

END



//Android
ELSE IF InAndroidMode() = True

T, N is int = 0

IdentificarTagsNoXml(XML_Retorno) //FUNCAO IDENTIFICA TAG

nQtde_tags is int = ArrayCount(arrXml_Tags)

TagRegistro, RegistroXml is string

TagValor is string

nQtde_Registros is int = XMLExtractString(EDT_XML,"Total") //5

LOOP (nQtde_Registros)

T = 0

N += 1

RegistroXml = PegaNoXml(XML_Retorno,N)

LOOP (nQtde_tags)

T += 1

TagRegistro = arrXml_Tags[T]

TagValor = XMLExtractString(RegistroXml,TagRegistro)

IF TagValor <> ""

Add(arrXml_TagResult,TagValor)

END

END

END

END

RESULT arrXml_TagResult


Outra Procedure

Procedure PegaNoXml(RetornoXml, NoXmlId) //outra procedure para facilitar, que nem dizia Jac, vamos por partes...

Inicio, Final, Tamanho is int = 0

NoXml is string = "<Xml><Retorno>"

IF RetornoXml <> "" AND NoXmlId > 0 THEN

Inicio = PositionOccurrence(RetornoXml,"<NoXml ID="+Charact(34)+NoXmlId+Charact(34)+">",firstRank,FromBeginning)

IF NoXmlId = 1
Final = PositionOccurrence(RetornoXml,"</NoXml>",firstRank,FromBeginning)
ELSE
Final = PositionOccurrence(RetornoXml,"</NoXml>",nextRank,FromBeginning)
END

Tamanho = Final - Inicio

NoXml += Middle(RetornoXml,Inicio,Tamanho)

END

NoXml += "</NoXml></Retorno></Xml>"

NoXml = Replace(NoXml,CR,"")
NoXml = Replace(NoXml,Charact(13),"")
NoXml = Replace(NoXml,Charact(10),"")

RESULT NoXml


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 9:40 PM
Lembrando que eu coloquei em modo ANSI o projeto inteiro





Se não aparece tudo em japonês, rssss.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em janeiro, 15 2016 - 10:04 PM
Prezados,

Segue aqui o fonte para estudos





https://mega.nz/…

Bons estudos

Tendo sugestões, sobre o assunto, favor postem material,
por mais simples que pareça, mas caso não tenha no help
é interessante para quem esta iniciando os estudos da
plataforma PcSoft.

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em julho, 27 2016 - 4:47 PM
Exemplo de XML para usar esse código:

<Xml>
<Retorno>
<NoXml ID="1">
<login_id>1</login_id>
<login_email>adriano@teste.com</login_email>
<login_nome>ADRIANO</login_nome>
<login_senha>123</login_senha>
<login_status>1</login_status>
<login_admin>0</login_admin>
</NoXml>
<NoXml ID="2">
<login_id>2</login_id>
<login_email>juliana@teste.com</login_email>
<login_nome>JULIANA</login_nome>
<login_senha>123456</login_senha>
<login_status>1</login_status>
<login_admin>0</login_admin>
</NoXml>
<NoXml ID="3">
<login_id>3</login_id>
<login_email>rafael@teste.com</login_email>
<login_nome>RAFAEL</login_nome>
<login_senha>123456789</login_senha>
<login_status>1</login_status>
<login_admin>0</login_admin>
</NoXml>
<Total>3</Total>
</Retorno>
</Xml>


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membro registado
3.651 mensagems
Popularité : +175 (223 votes)
Publicado em maio, 17 2017 - 2:54 PM
Prezados,

Segue vídeo complementar para a melhor compreensão:

https://www.screencast.com/t/82QOg2js

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/