Array
(
)

ler xml gerado a partir de um clientDataset em Delphi.

Eric Miranda
   - 13 ago 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.
#Código


?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

Emanoel Deivison
   - 13 ago 2012

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

Eric Miranda
   - 13 ago 2012

Tem alguma forma de eu ler isso no c#

Eric Miranda
   - 13 ago 2012

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

usei este código abaixo
#Código

 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

#Código
            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;
                }
            }

Emanoel Deivison
   - 13 ago 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.

Eric Miranda
   - 14 ago 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.
#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( [tagcod]
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()
};
}
}
}
[/tagcod], ); //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() }; } } }

Guinther
|
MVP
Pontos: 5
    14 ago 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

Emanoel Deivison
   - 14 ago 2012

Complementando o que o Guinther mencionou, segue link:

http://edn.embarcadero.com/br/article/37321

Emanoel Deivison
   - 14 ago 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).

Eric Miranda
   - 15 ago 2012

Valeu Guinther e Deivison pelas dicas..
abs