none
CRUDE XMl com nxn RRS feed

  • Pergunta

  • Boa tarde estou trabalhando em um projeto onde não pode haver banco, então pra armazenar minha lista de dados resolvi usar Xml.Estou tendo dois problemas ao alterar dados de nó, e fazer o manipulamento da relação nxn...

    Eu preciso que meu Arquivo Xml fique assim....

    <?xml version="1.0" encoding="utf-8"?>
    <Lotes>
      <Lote lote="1">
        <Posterior>53</Posterior>
        <Anterior>32</Anterior>
        <NumLeituras>2</NumLeituras>
        <Cabecalho>
          <Dia>2</Dia>
          <Mes>12</Mes>
          <Ano>13</Ano>
          <Hora>8</Hora>
          <Minuto>31</Minuto>
          <Semana>Segunda</Semana>
          <NumLote>1</NumLote>
        </Cabecalho>
        <LeiturasUmidades>
          <DiaLeitura>2</DiaLeitura>
          <HoraLeitura>11</HoraLeitura>
          <MinutoLeitura>17</MinutoLeitura>
          <TotalUmidade>30</TotalUmidade>
        </LeiturasUmidades>
        <LeiturasUmidades>
          <DiaLeitura>6</DiaLeitura>
          <HoraLeitura>11</HoraLeitura>
          <MinutoLeitura>15</MinutoLeitura>
          <TotalUmidade>30</TotalUmidade>
        </LeiturasUmidades>
      </Lote>
    </Lotes>

    Segue o que consegui fazer até o momento

    public List<Lote> ExibeDados()
    {
       for (int i = 1; i < dados.Count; i++)
       {
           teste = (byte[])dados[contDados]; contDados++;
           for (int j = 0; j < teste.Length; j++)
           {
              while (contA < contB)
              {
                  binarioA = decimalParaBinario(teste[contA]);
                  VerificaContA();
                  contA++;
                  binario += binarioA;
              }
              post =Convert.ToInt32(binario.Substring(0, 16), 2);
              loteLeituras.post = post;
              binario = String.Empty;
              binarioA = String.Empty;
              contB = contA + 2;
    
              while (contA < contB)
              {
                 binarioA = decimalParaBinario(teste[contA]);
                 VerificaContA();
                 contA++;
                 binario += binarioA;
              }
              ant = Convert.ToInt32(binario.Substring(0, 16), 2);
              loteLeituras.ant = ant;
              binario = String.Empty;
              binarioA = String.Empty;
              contB = contA + 2;
    
              while (contA < contB)
              {
                  binarioA = decimalParaBinario(teste[contA]);
                  VerificaContA();
                  contA++;
                  binario += binarioA;
              }
              numLeituras=Convert.ToInt32(binario.Substring(0, 16), 2);
              loteLeituras.numLeituras = numLeituras;
              binario = String.Empty;
              binarioA = String.Empty;
              contB = contA + 7;
    //cabecalho--------------------------------------------
              while (contA < contB)
              {
                 binarioA = decimalParaBinario(teste[contA]);
                 VerificaContA();
                 contA++;
                 binario += binarioA;
    
              }
                 int dia=Convert.ToInt32(binario.Substring(0, 5), 2);
                 cabecalho.dia = dia;
    
                 int mes = Convert.ToInt32(binario.Substring(5, 4), 2);
                 cabecalho.mes = mes;
    
                 int ano = Convert.ToInt32(binario.Substring(9, 7), 2);
                 cabecalho.ano = ano;
    
                 int hora = Convert.ToInt32(binario.Substring(16, 5), 2);
                 cabecalho.hora = hora;
    
                 int minuto=Convert.ToInt32(binario.Substring(21, 6), 2);
                 cabecalho.minuto = minuto;
    
                 int s = Convert.ToInt32(binario.Substring(27, 3), 2);
                 if (s == 0) cabecalho.semana = "Domingo";
                 if (s == 1) cabecalho.semana = "Segunda";
                 if (s == 2) cabecalho.semana = "Terça";
                 if (s == 3) cabecalho.semana = "Quarta";
                 if (s == 4) cabecalho.semana = "Quinta";
                 if (s == 5) cabecalho.semana = "Sexta";
                 if (s == 6) cabecalho.semana = "Sábado";
    
                int numLote=Convert.ToInt32(binario.Substring(30, 7), 2);
                 cabecalho.numLote = numLote;
    
                 int especieMadeira = Convert.ToInt32(binario.Substring(37, 5), 2);
    
                 int tempCorrecao = Convert.ToInt32(binario.Substring(42, 11), 2);
                 listaCabecalho.Add(cabecalho);
                 binario = String.Empty;
                 binarioA = String.Empty;
                 contB = contA + 4;
                 VerificaContA();
                 loteLeituras.Cabecalho = cabecalho;
    
    //Leituras---------------------------------------------
                for (int y = 0; y < loteLeituras.numLeituras; y++)
                {
                    while (contA < contB)
                    {
                       binarioA = decimalParaBinario(teste[contA]);
                       VerificaContA();
                       contA++;
                       binario += binarioA;
                     }
                     int diaLeitura = Convert.ToInt32(binario.Substring(0, 5), 2);
                     leitura.diaLeitura = diaLeitura;
                     int horaLeitura = Convert.ToInt32(binario.Substring(5, 5), 2);
                     leitura.horaLeitura = horaLeitura;
                     int minutoLeitura = Convert.ToInt32(binario.Substring(10, 6), 2);
                     leitura.minutoLeitura = minutoLeitura;
                     int totalUmidade = Convert.ToInt32(binario.Substring(16, 16), 2);
                     leitura.totalUmidade = totalUmidade;
                                
                               
    
                      listaLeituras.Add(leitura);
                      loteLeituras.Leitura = leitura;
                }
    
                contA = post + 1;
                contB = contA + 2;
                VerificaContA();
                listaLote.Add(loteLeituras);
                PopulaXML();
                        }
                    }
                
                return listaLote;
            }

    public void PopulaXML() {
                string path = "D:/Repositorio/Supervisório/Florianos/Florianos/LotesLeituras.xml";
                XDocument doc = XDocument.Load(path);
    
                var lot = from lo in doc.Element("Lotes").Elements("Lote") select lo;
                for (int i = 0; i < loteLeituras.numLeituras;i++)
                {
                    foreach(var l in lot.Where(x=>x.Element("Lote").Attribute("numLote").Value.Equals((1).ToString())))
                    {
                        l.Element("Posterior").Value = loteLeituras.post.ToString();
                        l.Element("Anterior").Value = loteLeituras.ant.ToString();
                        l.Element("NumLeituras").Value = loteLeituras.numLeituras.ToString();
                        l.Element("Cabecalho","",
                            l.Element("Dia").Value = cabecalho.dia.ToString(),
                            l.Element("Ano").Value = cabecalho.ano.ToString(),
                            l.Element("Hora").Value = cabecalho.hora.ToString(),
                            l.Element("Minuto").Value = cabecalho.minuto.ToString(),
                            l.Element("Semana").Value = cabecalho.semana.ToString(),
                            l.Element("NumLote").Value = cabecalho.numLote.ToString()),
                            // new XAttribute("EspecieMadeira",cabecalho.especieMadeira),
                            //new XAttribute("TemperaturaCorrecao",cabecalho.tempCorecao)),
                        new XElement("LeiturasUmidades",
                            new XElement("DiaLeitura", leitura.diaLeitura),
                            new XElement("HoraLeitura", leitura.horaLeitura),
                            new XElement("MinutoLeitura", leitura.minutoLeitura),
                            new XElement("TotalUmidade", leitura.totalUmidade))
                        ));
                doc.Save(path);
            }
        }
    }

    meu relacionamento é assim: 1 Lote tem 1 cabeçalho e pode conter N Leituras....

    segunda-feira, 9 de junho de 2014 17:39

Respostas

  • Oi Tamires,

    Ao invés de montar o XML na mão, você poderia usar o XmlSerializer, que é uma classe que transforma objetos em um arquivo XML ou vice-versa.

    Nele você informa a classe e o objeto que você deseja serializar, e ele monta o arquivo XML para você.

    Tem alguma documentação sobre isso aqui: http://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx

    Espero ter ajudado!

    • Marcado como Resposta TamiresAp quinta-feira, 12 de junho de 2014 16:11
    segunda-feira, 9 de junho de 2014 17:52