none
Criação de objeto a partir de XML RRS feed

  • Pergunta

  • Boa tarde pessoal, preciso de ajuda para criar um objeto a partir de um Xml.

    Estou consumindo um web service, no qual pego todas as mensagens enviadas de determinados veículos, ou seja, irei possuir um lista de mensagens de veiculos.

    Criei a seguinte classe MensagemVeiculo para representar a mensagem de somente um veiculo:

    using System;
    
    using System.Xml.Serialization;
    
    
    
    namespace XXX.XXX.Business.Domain
    
    {
    
     [Serializable]
    
     [XmlRoot(ElementName = "ResponseMensagemCB")]
    
     [XmlType("MensagemCB")]
    
     public class MensagemVeiculo
    
     {
    
      #region MensagemVeiculo Constructors
    
      
    
      public MensagemVeiculo() { }
    
    
    
      public MensagemVeiculo(int mensagemVeiculoId, int veiculoId, bool entradaPontoControle, bool saidaPontoControle)
    
      {
    
       this.MensagemVeiculoId = mensagemVeiculoId;
    
       this.VeiculoId = veiculoId;
    
       this.EntradaPontoControle = entradaPontoControle;
    
       this.SaidaPontoControle = saidaPontoControle; 
    
      }
    
    
    
      #endregion
    
    
    
      #region MensagemVeiculo Properties
    
    
    
      [XmlElement(ElementName = "mId")]
    
      public Int64 MensagemVeiculoId { get; set; } //mId  Id da mensagem;
    
    
    
      [XmlElement(ElementName = "veiID")]
    
      public int VeiculoId { get; set; } //veiID  Id do veículo;  
    
    
    
      [XmlElement(ElementName = "dt")]
    
      public DateTime DataMensagemVeiculo { get; set; } //dt  Data e hora da mensagem
    
    
    
      [XmlElement(ElementName = "lat")]
    
      public double Latitude { get; set; } //lat  Latitude
    
    
    
      [XmlElement(ElementName = "lon")]
    
      public double Longitude { get; set; } //lon  Longitude
    
    
    
      [XmlElement(ElementName = "mun")]
    
      public string Municipio { get; set; } //mun  Município referente posição
    
    
    
      [XmlElement(ElementName = "uf")]
    
      public string Uf { get; set; } //uf  Estado referente posição
    
    
    
      [XmlElement(ElementName = "rod", IsNullable = false)]  
    
      public string Rodovia { get; set; } //rod  Rodovia referente posição
    
    
    
      [XmlElement(ElementName = "rua", IsNullable = false)]
    
      public string Rua { get; set; } //rua  Rua referente posição
    
    
    
      [XmlElement(ElementName = "vel")]
    
      public double VelocidadeVeiculo { get; set; } //vel
    
    
    
      [XmlElement(ElementName = "evt1", IsNullable = false)]
    
      public bool BuserMensagensAcionado { get; set; } //evt1
    
    
    
      [XmlElement(ElementName = "evt2", IsNullable = false)]
    
      public bool SireneAcionada { get; set; } //evt2
    
    
    
      [XmlElement(ElementName = "evt3", IsNullable = false)]
    
      public bool VeiculoBloqueado { get; set; } //evt3
    
    
    
      [XmlElement(ElementName = "evt4", IsNullable = false)]
    
      public int IgnicaoAcionada { get; set; } //evt4
    
    
    
      [XmlElement(ElementName = "evt5", IsNullable = false)]
    
      public bool BotaoPanicoAcionado { get; set; }//evt5
    
    
    
      [XmlElement(ElementName = "evt6", IsNullable = false)]
    
      public bool BotaoAvisoCabinePressionado { get; set; }//evt6
    
    
    
      [XmlElement(ElementName = "evt7", IsNullable = false)]
    
      public bool ProblemasVeiculoFalhaComunicacao { get; set; }//evt7
    
    
    
      [XmlElement(ElementName = "evt8", IsNullable = false)]
    
      public bool DesengateCarretaUm { get; set; }//evt8
    
    
    
      [XmlElement(ElementName = "evt9", IsNullable = false)]
    
      public bool BotaoTravaQuintaRodaAcionado { get; set; }//evt9
    
    
    
      [XmlElement(ElementName = "evt10", IsNullable = false)]
    
      public bool TravaBauDestravado { get; set; }//evt10
    
    
    
      [XmlElement(ElementName = "evt11", IsNullable = false)]
    
      public bool PiscaAlertaAcionado { get; set; }//evt11
    
    
    
      [XmlElement(ElementName = "evt12", IsNullable = false)]
    
      public bool PortaCaronaAcionada { get; set; }//evt12
    
    
    
      [XmlElement(ElementName = "evt13", IsNullable = false)]
    
      public bool PortaMotoristaAcionada { get; set; }//evt13
    
    
    
      [XmlElement(ElementName = "evt14", IsNullable = false)]
    
      public bool PortaBauAberta { get; set; }//evt14
    
    
    
      [XmlElement(ElementName = "evt15", IsNullable = false)]
    
      public bool BotaoTravaBauAcionada { get; set; }//evt15
    
    
    
      [XmlElement(ElementName = "evt16", IsNullable = false)]
    
      public bool BateriaViolada { get; set; }//evt16
    
    
    
      [XmlElement(ElementName = "evt17", IsNullable = false)]
    
      public bool CaboVelocimetroViolado { get; set; }//evt17
    
    
    
      [XmlElement(ElementName = "evt18", IsNullable = false)]
    
      public bool CaboRS232Violado { get; set; }//evt18
    
    
    
      [XmlElement(ElementName = "evt19", IsNullable = false)]
    
      public bool EDN1 { get; set; }//evt19
    
    
    
      [XmlElement(ElementName = "evt20", IsNullable = false)]
    
      public bool EDN2 { get; set; }//evt20
    
    
    
      [XmlElement(ElementName = "evt21", IsNullable = false)]
    
      public bool EDP1 { get; set; }//evt21
    
    
    
      [XmlElement(ElementName = "evt22", IsNullable = false)]
    
      public bool IButton { get; set; }//evt22
    
    
    
      [XmlElement(ElementName = "evt23", IsNullable = false)]
    
      public bool EVS1 { get; set; }//evt23 Violação por Movimento Indevido
    
    
    
      [XmlElement(ElementName = "evt24", IsNullable = false)]
    
      public bool SDP1 { get; set; }//evt24, evt25
    
    
    
      [XmlElement(ElementName = "evt26", IsNullable = false)]
    
      public bool InformaValorTemperatura { get; set; }//evt26
    
    
    
      [XmlElement(ElementName = "evt27", IsNullable = false)]
    
      public bool DesengateCarretaDois { get; set; }//evt27
    
    
    
      [XmlElement(ElementName = "evt28", IsNullable = false)]
    
      public bool ViolacaoPainel { get; set; }//evt28
    
    
    
      [XmlElement(ElementName = "evt29", IsNullable = false)]
    
      public bool TecladoDesconectado { get; set; }//evt29
    
    
    
      [XmlElement(ElementName = "evt30", IsNullable = false)]
    
      public bool ContraSenhaSinistro { get; set; }//evt30
    
    
    
      [XmlElement(ElementName = "evt31", IsNullable = false)]
    
      public bool BotaoPanicoEscondidoPressionado { get; set; }//evt31
    
    
    
      [XmlElement(ElementName = "evt32", IsNullable = false)]
    
      public bool SensorJanelaMotorista { get; set; }//evt32
    
    
    
      [XmlElement(ElementName = "evt33", IsNullable = false)]
    
      public bool SensorJanelaCarona { get; set; }//evt33
    
    
    
      [XmlElement(ElementName = "evt34", IsNullable = false)]
    
      public bool VelocidadeMaximaExcedida { get; set; }//evt34
    
    
    
      [XmlElement(ElementName = "evt35", IsNullable = false)]
    
      public bool ValorMaximoRpmUltrapassado { get; set; }//evt35
    
    
    
      [XmlElement(ElementName = "evt36", IsNullable = false)]
    
      public bool TentativasSenhaDesbloqueio { get; set; }//evt36
    
    
    
      [XmlElement(ElementName = "evt37", IsNullable = false)]
    
      public bool SensorTemperaturaUm { get; set; }//evt37
    
    
    
      [XmlElement(ElementName = "evt38", IsNullable = false)]
    
      public bool SensorTemperaturaDois { get; set; }//evt38
    
    
    
      [XmlElement(ElementName = "evt39", IsNullable = false)]
    
      public bool SensorTemperaturaTres { get; set; }//evt39
    
    
    
      [XmlElement(ElementName = "evt40", IsNullable = false)]
    
      public bool EntradaPontoControle { get; set; } //evt40  Entrada Ponto de Controle (smart)
    
    
    
      [XmlElement(ElementName = "evt41", IsNullable = false)]
    
      public bool SaidaPontoControle { get; set; } //evt41  Saida Ponto de Controle (smart)
    
    
    
      [XmlElement(ElementName = "dMac", IsNullable = false)]
    
      public string DescricaoMacro { get; set; } //dMac  Descrição da Macro recebida 
    
    
    
      [XmlElement(ElementName = "tfrID", IsNullable = false)]
    
      public int MacroId { get; set; } //tfrID  Código da Macro
    
    
    
      [XmlElement(ElementName = "st1", IsNullable = false)]
    
      public int ValorSensorTemperaturaUm { get; set; }//st1
    
    
    
      [XmlElement(ElementName = "st2", IsNullable = false)]
    
      public int ValorSensorTemperaturaDois { get; set; }//st2
    
    
    
      [XmlElement(ElementName = "st3", IsNullable = false)]
    
      public int ValorSensorTemperaturaTres { get; set; }//st3
    
    
    
      [XmlElement(ElementName = "ori")]
    
      public int OrigemMensagem { get; set; }//ori
    
    
    
      [XmlElement(ElementName = "tpMsg")]
    
      public int TipoMensagem { get; set; }//tpMsg
    
    
    
      [XmlElement(ElementName = "dtinc")]
    
      public DateTime GravacaoServidor { get; set; }//dtinc
    
    
    
      [XmlElement(ElementName = "evtG", IsNullable = false)]
    
      public int EventoGeradorMensagem { get; set; }//evtG
    
    
    
      [XmlElement(ElementName = "rpm", IsNullable = false)]
    
      public int Rpm { get; set; }
    
    
    
      [XmlElement(ElementName = "odm", IsNullable = false)]
    
      public int Odometro { get; set; }//odm
    
    
    
      [XmlElement(ElementName = "lt", IsNullable = false)]
    
      public int QuantidadeLitrosTotalTanque { get; set; }//lt
    
    
    
      [XmlElement(ElementName = "mLog", IsNullable = false)]
    
      public int MensagemLog { get; set; }//mLog
    
    
    
      [XmlElement(ElementName = "pcoID")]
    
      public int IdentificacaoPontoControle { get; set; }//pcoID
    
    
    
      #endregion
    
     } 
    
    }
    
    

    E tenho a seguinte estrutura do Xml:

     <?xml version="1.0" encoding="UTF-8" ?> 
    
    - <ResponseMensagemCB>
    
    - <MensagemCB>
    
     <mId>4801913876</mId> 
    
     <veiID>18531</veiID> 
    
     <dt>2010-07-26T16:43:57-03:00</dt> 
    
     <lat>-5,7419</lat> 
    
     <lon>-35,2886</lon> 
    
     <mun>SAO GONCALO DO AMARANTE</mun> 
    
     <uf>RN</uf> 
    
     <rod>BR-101</rod> 
    
     <rua /> 
    
     <vel>0</vel> 
    
     <evt13>true</evt13> 
    
     <ori>2</ori> 
    
     <tpMsg>1</tpMsg> 
    
     <dtInc>2010-07-26T16:43:18-03:00</dtInc> 
    
     <evtG>13</evtG> 
    
     </MensagemCB>
    
    - <MensagemCB>
    
     <mId>4801913911</mId> 
    
     <veiID>47175</veiID> 
    
     <dt>2010-07-26T16:40:19-03:00</dt> 
    
     <lat>-8,0847</lat> 
    
     <lon>-34,9547</lon> 
    
     <mun>RECIFE</mun> 
    
     <uf>PE</uf> 
    
     <rod>BR-101</rod> 
    
     <rua /> 
    
     <vel>0</vel> 
    
     <evt4>-1</evt4> 
    
     <ori>2</ori> 
    
     <tpMsg>2</tpMsg> 
    
     <dtInc>2010-07-26T16:43:18-03:00</dtInc> 
    
     </MensagemCB>
    
    - <MensagemCB>
    
     <mId>4801913920</mId> 
    
     <veiID>33818</veiID> 
    
     <dt>2010-07-26T16:41:09-03:00</dt> 
    
     <lat>-25,1072</lat> 
    
     <lon>-48,8228</lon> 
    
     <mun>CAMPINA GRANDE DO SUL</mun> 
    
     <uf>PR</uf> 
    
     <rod>BR-116</rod> 
    
     <rua /> 
    
     <vel>31</vel> 
    
     <evt4>1</evt4> 
    
     <ori>2</ori> 
    
     <tpMsg>2</tpMsg> 
    
     <dtInc>2010-07-26T16:43:18-03:00</dtInc> 
    
     </MensagemCB>- 
    
     </ResponseMensagemCB>

    Porém, analisando bem o arquivo Xml e a Classe que representa a mensagem, possue tags que não estão disponíveis no arquivo xml, pois as mesmas são opcionais, ou seja, nem sempre estará na estrutura do arquivo.

    Criei a seguinte classe para deserializar o arquivo:

    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Text;
    
    using System.Xml;
    
    using XXX.XXX.Business.Domain;
    
    using System.IO;
    
    using System.Xml.Serialization;
    
    
    
    namespace XXX.XXX.Business.Rules
    
    {
    
     public class MensagensVeiculoBO : IMensagensVeiculoBO
    
     {
    
      #region IMensagensVeiculoBO Members
    
    
    
      public void CreateObjectFromXml()
    
      {
    
         string fileName = "C:/Teste/teste.xml";
    
         List<MensagensVeiculo> mensagensVeiculo = SerializationUtil.DeserializeList<MensagensVeiculo>(fileName, "ResponseMensagemCB/MensagemCB");*/
    
       string fileName = "C:/Teste/MensagemCB.xml";
    
       FileStream fs = new FileStream(fileName, FileMode.Open);
    
    
    
       XmlSerializer xs = new XmlSerializer(typeof(MensagemVeiculo));
    
    
    
       MensagemVeiculo mensagemVeiculo = (MensagemVeiculo)xs.Deserialize(fs);
    
    
    
       fs.Close();
    
       
    
      }
    
    
    
      #endregion
    
     }
    
    }

    Não tenho muita experiência em Xml, estou lendo bastante a respeito, porém não estou conseguindo resolver os erros ocorridos pela falta de experiência.

    Já partir para utilizar DataSet, porém acredito ser mais complicado, visto que o objeto não terá todas as propriedades presentes sempre.

    Então, peço favor que me ajudem a melhor maneira de resolver esse problema.

    Estou criando uma outra classe que representará todas as mensagens dos veículos: MensagenVeiculoList(), mas não tenho certeza se será necessário criá-la.

    Por favor, me ajudem.

     


    "Analista de Sistemas" + "Engenheiro Eletricista"
    terça-feira, 27 de julho de 2010 17:45

Respostas

  • Ola Deryck,

    Pelo que entendi tu está tentando criar um objeto apartir de um xml,  se for isso mesmo o .net rem recuros próprio para isso.

    faça assim:

    1º - vá em iniciar/todos os programas/Microsoft Visual Studio 2008/Visual Studio Tools/Visual Studio 2008 Command Prompt

    2º - Então apartir da linha de comando acesse o diretório que está o seu xml e digite xsd Nome do Teu arquivo.xml /outputdir:c:/

    3º - ainda no prompt vá no diretório c:/ e digite xsd C:\Nome do Arquivo Criado.xsd /t:lib /l:cs /c

    depois de seguir esse passos tu terá um arquivo .cs que é o objeto do seu xml , assim voce poderá instânciar os nós que tu precisa e usar a serialização como tem feito.

    se ficar dúvida pode perguntar ai ou ir nos links http://msdn.microsoft.com/en-us/library/x6c1kb0s.aspx e http://www.codeproject.com/KB/XML/XmlToClassAndBack.aspx

     

    espero ter ajudado abraço

    • Marcado como Resposta Deryck Azeredo terça-feira, 5 de outubro de 2010 00:34
    quinta-feira, 30 de setembro de 2010 15:15