ler xml gerado a partir de um clientDataset em Delphi.

.NET

13/08/2012

Bom dia galera!
Estou iniciando alguns projetos em C#. Tenho um sistema em Delphi no qual utilizo o ClientDataSet exportando para xml e gravo os dados na base de dados. Agora um sistema em C# preciso ler essas informaçoes para tratá-la.. Porém todos os exemplos que pesquisei na web não funcionaram(pode ser claro pela minha falta de experiencia na linguagem).
segue abaixo o xml.

?xml version=1.0 standalone=true?
-DATAPACKET Version=2.0-METADATA-FIELDSFIELD fieldtype=dateTime attrname=DATA/FIELD fieldtype=string attrname=USUARIO WIDTH=20/FIELD fieldtype=string attrname=TIPO WIDTH=10/FIELD fieldtype=string attrname=CID WIDTH=5/FIELD fieldtype=string attrname=CID_DESC WIDTH=265/FIELD fieldtype=string attrname=MORFOLOGICO WIDTH=120/FIELD fieldtype=i4 attrname=TUMORID/FIELD fieldtype=i4 attrname=TNM_SISTEMAID/FIELD fieldtype=i4 attrname=TNM_TUMORID/FIELD fieldtype=i4 attrname=TNM_NODOID/FIELD fieldtype=i4 attrname=TNM_METASTASEID/FIELD fieldtype=i4 attrname=TNM_GRAUID/FIELD fieldtype=string attrname=TIPOTUMOR WIDTH=60/FIELD fieldtype=string attrname=SISTEMA WIDTH=70/FIELD fieldtype=string attrname=TUMOR WIDTH=2/FIELD fieldtype=string attrname=NODO WIDTH=2/FIELD fieldtype=string attrname=METASTASE WIDTH=2/FIELD fieldtype=string attrname=GRAU WIDTH=2/FIELD fieldtype=i4 attrname=HEMATOLOGICOID/FIELD fieldtype=i4 attrname=SUBHEMATOLOGICOID/FIELD fieldtype=string attrname=DESC_TUMOR WIDTH=510/FIELD fieldtype=string attrname=DESC_NODO WIDTH=410/FIELD fieldtype=string attrname=DESC_METASTASE WIDTH=120/FIELD fieldtype=string attrname=DESC_GRAU WIDTH=100/FIELD fieldtype=string attrname=DESC_HEMATO WIDTH=190/FIELD fieldtype=string attrname=DESC_SUBHEMATO WIDTH=190/FIELD fieldtype=string attrname=ESTADIO WIDTH=12/FIELD fieldtype=dateTime attrname=DATA_RECIDIVA/FIELD fieldtype=dateTime attrname=DATA_PD//FIELDSPARAMS CHANGE_LOG=1 0 4 2 1 8//METADATA-ROWDATAROW ESTADIO=I DESC_HEMATO=I Envolvimento de uma única região linfática, ou estrutura linfóide, ou um único local extralinfático HEMATOLOGICOID=32 SISTEMA=HEMATOLÓGICO TIPOTUMOR=LINFOMAS NÃO HODGKIN TNM_SISTEMAID=57 TUMORID=32 CID_DESC=GRANDES CÉLULAS (DIFUSO) CID=C83.3 TIPO=PRIMÁRIO USUARIO=CRISTIANO.FERNANDES DATA=20120723T18:40:36548 RowState=5/ROW ESTADIO=II DESC_HEMATO=II Envolvimento de duas ou mais regiões linfáticas do mesmo lado do diafragma HEMATOLOGICOID=33 SISTEMA=HEMATOLÓGICO TIPOTUMOR=LINFOMAS NÃO HODGKIN TNM_SISTEMAID=57 TUMORID=32 CID_DESC=GRANDES CÉLULAS (DIFUSO) CID=C83.3 TIPO=PRIMÁRIO USUARIO=CRISTIANO.FERNANDES DATA=20120723T18:40:36548 RowState=12//ROWDATA/DATAPACKET


obrigado galera
Eric Miranda

Eric Miranda

Curtidas 0

Respostas

Deivison Melo

Deivison Melo

13/08/2012

O XML que o clientdataset cria é um outro tipo diferente do padrão UTF-8.
GOSTEI 0
Eric Miranda

Eric Miranda

13/08/2012

Tem alguma forma de eu ler isso no c#
GOSTEI 0
Eric Miranda

Eric Miranda

13/08/2012

galera de acordo com o arquivo xml que mostrei acima, eu estou quase chegando... mas travo no final..

usei este código abaixo
 string arquivo = @D:\temp.xml;

            //Carrega o arquivo XML

                  XmlTextReader linha = new XmlTextReader(arquivo);


                  while (linha.Read())
                  {

                      if( linha.Name == ROW )

                          // Escreve o valor da linha.

                          temp = linha.ToString();

                  }

até chega a achar a linha ROW, mas aí preciso pegar os valores... aí que não consigo..

com o código abaixo chego quase no mesmo ponto

            XElement xml = XElement.Load( @D:\temp.xml );
            string temp = null;
            foreach( XElement x in xml.Elements() )
            {
                if (x.Name == ROWDATA)
                {
                    temp = x.Attribute(ESTADIO).Value;
                }
            }
GOSTEI 0
Deivison Melo

Deivison Melo

13/08/2012

Você deverá solicitar que o desenvolvedor que fez isso em delphi que utilize os componentes para criação e leitura do xml de forma nativa (UTF-8) e aí vc conseguirá manipular de forma normal.
GOSTEI 0
Eric Miranda

Eric Miranda

13/08/2012

Bom dia galera. Cheguei no resultado que queria. não sei se da forma correta ou mais elegante mas funcionou.
Valeu Deivison pela ajuda.
Segue abaixo o código.
            StringBuilder sql = new StringBuilder();
             sql.Append( SELECT CID_XML  );
             sql.Append( FROM RES_ANAMNESE  );

             string strConn = ConfigurationManager.AppSettings[FbConnectionString];
             FbConnection conn = new FbConnection( strConn );
             conn.Open();
             FbCommand cmd = new FbCommand( sql.ToString(), conn );

             FbDataReader reader = cmd.ExecuteReader();
             ListCidXml listaXML = new ListCidXml();
             string cid;
             string datatemp;
             while( reader.Read() )
             {
                 cid = reader.GetString( 0 );
                 cid = cid.Replace( \\\, \ );
                 cid = cid.Replace( \0,  );


                 //Carrega o arquivo XML
                 XmlTextReader linha = new XmlTextReader(new StringReader(cid));

                 // Enquando existir linha no arquivo fa‡a

                 while( linha.Read() )
                 {
                     // Se for uma linha de conteudo apresente do valor da linha.
                     if( linha.Name == ROW )
                     {
                         // Escreve o valor da linha.
                         datatemp = linha.GetAttribute( DATA ).ToString();
                         datatemp = datatemp.Substring( 6, 2 ) + / + datatemp.Substring( 4, 2 ) + / + datatemp.Substring( 0, 4 ) +   +
                                     datatemp.Substring( 9, 8 );
                         CidXml cidXml = new CidXml() 
                         { 
                            Data = Convert.ToDateTime( datatemp ),
                            Cid = linha.GetAttribute( CID ).ToString(),
                            Estadio = linha.GetAttribute( ESTADIO ).ToString()
                         }; 
                     }
                 }
             }
GOSTEI 0
Guinther Pauli

Guinther Pauli

13/08/2012

Eric

Experimente dar uma olhada no XML Mapper do Delphi, ele pode converter os XML Data Packets do ClientDataSet para um formato XML que pode ser lido diretamente em C# até mesmo por um DataSet do ADO.NET, ou por um XmlTextReader.

Att,

--
Guinther Pauli
Delphi Certified Professional - 3,5,6,7,2005,2006,Delphi Web,Kylix,XE
Microsoft Certified Professional - MCP,MCAD,MCSD.NET,MCTS,MCPD (C#, ASP.NET, Arquitetura)
Colaborador Editorial Revistas .net Magazine e ClubeDelphi
http://gpauli.com
http://www.facebook.com/guintherpauli
http://www.twitter.com/guintherpauli
GOSTEI 0
Deivison Melo

Deivison Melo

13/08/2012

Complementando o que o Guinther mencionou, segue link:

http://edn.embarcadero.com/br/article/37321
GOSTEI 0
Deivison Melo

Deivison Melo

13/08/2012

Há ainda:

http://www.caiooliveira.com.br/?p=65

PS. Lembrando que Para criar a interface delphi (caso for vc, ou solicitar a outro desenvolvedor que utilize o componente XMLTransformProvider, o arquivo XML pode ser transformado para uma outra estrutura desejada, e convertida para o formato que possa ser utilizado em conjunto com o ClientDataSet para manipular os dados como se estivessem em uma tabela de um banco de dados (Link do exemplo anterior: http://edn.embarcadero.com/br/article/37321).

GOSTEI 0
Eric Miranda

Eric Miranda

13/08/2012

Valeu Guinther e Deivison pelas dicas..
abs
GOSTEI 0
POSTAR