Usuário com melhor resposta
Criação de objeto a partir de XML

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"
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.aspxespero ter ajudado abraço
- Marcado como Resposta Deryck Azeredo terça-feira, 5 de outubro de 2010 00:34