none
Xml com XElements na mesma linha?? RRS feed

  • Pergunta

  • Olá pessoal!

    Estou fazendo a integração do software utilizado pela empresa para um outro software que vai adicionar funcionalidades ao mesmo. Para isso, a empresa responsável me pede um xml com dados no seguinte formato:

    <xml>
    <Clientes><cod_cliente>1072</cod_cliente><cod_portador>0235</cod_portador><des_Nome_abreviado>Comercial Paulo LTDA</des_Nome_abreviado><des_Nome>BAR DO PAULO</des_Nome><cod_cond_pagamento>001</cod_cond_pagamento><des_condicao>30 DIAS</des_condicao><dia_vcmto>20</dia_vcmto></Clientes>
    <Clientes><cod_cliente>1073</cod_cliente><cod_portador>0236</cod_portador><des_Nome_abreviado>Comercial Jose LTDA</des_Nome_abreviado><des_Nome>BAR DO JOSE</des_Nome><cod_cond_pagamento>001</cod_cond_pagamento><des_condicao>20 DIAS</des_condicao><dia_vcmto>15</dia_vcmto></Clientes>
    <Clientes><cod_cliente>1074</cod_cliente><cod_portador>0237</cod_portador><des_Nome_abreviado>Comercial Roberto LTDA</des_Nome_abreviado><des_Nome>BAR DO BETO</des_Nome><cod_cond_pagamento>001</cod_cond_pagamento><des_condicao>10 DIAS</des_condicao><dia_vcmto>10</dia_vcmto></Clientes>
    
    <Unidades><cod_unidade>5276525</cod_unidade><cod_local>02359</cod_local><cod_cliente>1072</cod_cliente><des_complemento_local>APTO 301</des_complemento_local><nro_leitura_anterior>5369</nro_leitura_anterior><cod_data_leitura_ant>31/11/2010</cod_data_leitura_ant><cod_data_prox_leitura>31/10/2010</cod_data_prox_leitura><nro_valor_unitario>1999</nro_valor_unitario><vlr_media_consumo>1000</vlr_media_consumo></Unidades>
    <Unidades><cod_unidade>5276526</cod_unidade><cod_local>02360</cod_local><cod_cliente>1073</cod_cliente><des_complemento_local>APTO 201</des_complemento_local><nro_leitura_anterior>35369</nro_leitura_anterior><cod_data_leitura_ant>31/11/2010</cod_data_leitura_ant><cod_data_prox_leitura>31/11/2010</cod_data_prox_leitura><nro_valor_unitario>999</nro_valor_unitario><vlr_media_consumo>5000</vlr_media_consumo></Unidades>
    <Unidades><cod_unidade>5276527</cod_unidade><cod_local>02361</cod_local><cod_cliente>1074</cod_cliente><des_complemento_local>APTO 101</des_complemento_local><nro_leitura_anterior>235369</nro_leitura_anterior><cod_data_leitura_ant>31/11/2010</cod_data_leitura_ant><cod_data_prox_leitura>31/12/2010</cod_data_prox_leitura><nro_valor_unitario>30999</nro_valor_unitario><vlr_media_consumo>25000</vlr_media_consumo></Unidades>
    <Unidades><cod_unidade>5276528</cod_unidade><cod_local>02362</cod_local><cod_cliente>1072</cod_cliente><des_complemento_local>APTO 701</des_complemento_local><nro_leitura_anterior>23539</nro_leitura_anterior><cod_data_leitura_ant>11/11/2010</cod_data_leitura_ant><cod_data_prox_leitura>01/12/2010</cod_data_prox_leitura><nro_valor_unitario>165</nro_valor_unitario><vlr_media_consumo>900</vlr_media_consumo></Unidades>
    <Unidades><cod_unidade>5276529</cod_unidade><cod_local>02363</cod_local><cod_cliente>1073</cod_cliente><des_complemento_local>APTO 801</des_complemento_local><nro_leitura_anterior>2353</nro_leitura_anterior><cod_data_leitura_ant>11/11/2010</cod_data_leitura_ant><cod_data_prox_leitura>01/12/2010</cod_data_prox_leitura><nro_valor_unitario>8499</nro_valor_unitario><vlr_media_consumo>4500</vlr_media_consumo></Unidades>
    <Unidades><cod_unidade>5276530</cod_unidade><cod_local>02364</cod_local><cod_cliente>1074</cod_cliente><des_complemento_local>APTO 901</des_complemento_local><nro_leitura_anterior>235</nro_leitura_anterior><cod_data_leitura_ant>11/11/2010</cod_data_leitura_ant><cod_data_prox_leitura>01/12/2010</cod_data_prox_leitura><nro_valor_unitario>987</nro_valor_unitario><vlr_media_consumo>2600</vlr_media_consumo></Unidades>
    

    Percebam que os elementos ficam um do lado do outro, sendo que o elemento raiz quando fechado, dá uma quebra de linha no código. Para gerar o XML estou utilizando o seguinte código:

    public void Gera_XML_Total()
            {
                try 
                {
                    using (dados = new DadosDataContext())
                    {
                        dados.CommandTimeout = 300;
                        var query = from c in dados.G010s join p in dados.G000s
                                    on c.G010_G000_ID equals p.G000_ID
                                    where p.flagcancelado == false 
                                    select new
                                    {
                                        c.G010_ID,
                                        c.G010_NOME,
                                        p.G000_DIA_VENCIMENTO_PADRAO
                                      
                                    };
                        List<XElement> elements = new List<XElement>();
                        foreach (var item in query)
                        {
                            elements.Add(new XElement("clientes",
                                new XAttribute("cod_cliente",item.G010_ID),
                                new XAttribute("cod_portador", "0341"),
                                new XAttribute("des_Nome_abreviado", item.G010_NOME),
                                new XAttribute("des_Nome", item.G010_NOME),
                                new XAttribute("cod_cond_pagamento", "1"),
                                new XAttribute("des_condicao", "22")));
                        }
                            xsefaz = new XDocument(
                                new XElement("SivaCob", elements
                                    )
                                );
                        
                    }
                    //XML pronto
                    string xml = xsefaz.ToString();
    
                    //Salvando XML
                    xsefaz.Save(@"C:\Users\Ariel\Desktop\XML\abc1.xml");
                   
                }
                catch (FormatException erro)
                {
                    throw new FormatException("Erro 01: " + erro.Message);
                }
                catch (EvaluateException erro)
                {
                    throw new EvaluateException("Erro 02: " + erro.Message);
                }
                catch (Exception erro)
                {
                    throw new Exception("Erro 03: " + erro.Message);
                }
            }

    Mas assim, o que se gera é o seguinte:

    <?xml version="1.0"?>
    <SivaCob>
      <clientes cod_portador="0341" des_Nome_abreviado="ALEXANDRE AP SILVA HOLANDA" des_Nome="ALEXANDRE AP SILVA HOLANDA" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="PATRICIA BORIN" des_Nome="PATRICIA BORIN" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="SUELI  CARVALHO SILVA " des_Nome="SUELI  CARVALHO SILVA " cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="ANTONIA MARIA BERNARDES" des_Nome="ANTONIA MARIA BERNARDES" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="ZENARIA GONCALVES DE PAULA" des_Nome="ZENARIA GONCALVES DE PAULA" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="VALDECI AP  CAETANO DE BARROS" des_Nome="VALDECI AP  CAETANO DE BARROS" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="VALDIR JOSE MOREIRA" des_Nome="VALDIR JOSE MOREIRA" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="MARIA DE LOURDES GADELIA" des_Nome="MARIA DE LOURDES GADELIA" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="AP. 33 BL. 7" des_Nome="AP. 33 BL. 7" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="MARCOS ARAUJO" des_Nome="MARCOS ARAUJO" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="JAIR COSTA ARAUJO" des_Nome="JAIR COSTA ARAUJO" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="NOEME SANTOS CASTRO" des_Nome="NOEME SANTOS CASTRO" cod_cond_pagamento="1" des_condicao="22">false</clientes>
      <clientes cod_portador="0341" des_Nome_abreviado="PAULO E RIBEIRO" des_Nome="PAULO E RIBEIRO" cod_cond_pagamento="1" des_condicao="22">false</clientes>
    </SivaCob>

    Se eu mudo de XAttribute para XElement, fica identado, e tem que ser na mesma linha. Na mesma linha só fica se for com XAttribute mas aí não são criadas as tags de abertura e fechamento...Como posso proceder, dentro do código que tenho, para criar o xml dentro deste formato solicitado?

    Agradeço de antemão a ajuda! Obrigado!

    terça-feira, 14 de fevereiro de 2012 12:49

Respostas

  • Ariel veja se isso te ajuda:

    string xml = xsefaz.ToString().Replace("\r\n", "");


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Editado Vitor Mendes terça-feira, 14 de fevereiro de 2012 13:35
    • Marcado como Resposta Ariel de Souza terça-feira, 14 de fevereiro de 2012 18:52
    terça-feira, 14 de fevereiro de 2012 13:35
  • Ariel veja se isso te ajuda:

    string xml = xsefaz.ToString().Replace("\r\n", "");


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    Conseguimos aqui! Ficou assim:

            public void Gera_XML_Total()
            {
                try 
                {
                    using (dados = new DadosDataContext())
                    {
                        dados.CommandTimeout = 300;
                        var query = from c in dados.G010s
                                    join p in dados.G000s
                                        on c.G010_G000_ID equals p.G000_ID
                                    where p.flagcancelado == false
                                    select new
                                    {
                                        c.G010_ID,
                                        c.G010_NOME,
                                        p.G000_DIA_VENCIMENTO_PADRAO
    
                                    };
                        List<XElement> clientes = new List<XElement>();
    
                        foreach (var item in query)
                        {
                            clientes.Add(new XElement("clientes",
                                new XElement("cod_cliente", item.G010_ID),
                                new XElement("cod_portador", "0341"),
                                new XElement("des_Nome_abreviado", item.G010_NOME),
                                new XElement("des_Nome", item.G010_NOME),
                                new XElement("cod_cond_pagamento", "1"),
                                new XElement("des_condicao", "22")));
                        }
    
                        string caminho = @"C:\Users\Ariel\Desktop\XML\abc1.xml";
                        using (FileStream fsRemessa =
                                       new FileStream(caminho, FileMode.Create, FileAccess.Write))
                        {
                            using (StreamWriter sw = new StreamWriter(fsRemessa))
                            {
    
                                string xml = "<xml>\r\n";
                                foreach (var item in clientes.ToList())
                                {
                                    xml += item.ToString().Replace("\r\n", "").Replace(" ", "").Trim();
    
    
                                    sw.WriteLine(xml);
    
    
    
    
                                    xml = String.Empty;
                                }
    
    
                                xml += "</xml>";
    
                                sw.WriteLine(xml);
    
                            }
    
                        }
    
    
    
                    }
                            
                }
                catch (FormatException erro)
                {
                    throw new FormatException("Erro 01: " + erro.Message);
                }
                catch (EvaluateException erro)
                {
                    throw new EvaluateException("Erro 02: " + erro.Message);
                }
                catch (Exception erro)
                {
                    throw new Exception("Erro 03: " + erro.Message);
                }
            }

    Ficou completamente diferente do que você postou Vitor, mas sua ajuda nos levou a pensar diferente aqui e chegamos nessa conclusão. Obrigado!!

    • Marcado como Resposta Ariel de Souza terça-feira, 14 de fevereiro de 2012 18:52
    terça-feira, 14 de fevereiro de 2012 18:52

Todas as Respostas

  • Ariel veja se isso te ajuda:

    string xml = xsefaz.ToString().Replace("\r\n", "");


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    • Editado Vitor Mendes terça-feira, 14 de fevereiro de 2012 13:35
    • Marcado como Resposta Ariel de Souza terça-feira, 14 de fevereiro de 2012 18:52
    terça-feira, 14 de fevereiro de 2012 13:35
  • Ariel veja se isso te ajuda:

    string xml = xsefaz.ToString().Replace("\r\n", "");


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    Fala Vitor! Cara não deu certo...veja como eu fiz:

            public void Gera_XML_Total()
            {
                try 
                {
                    using (dados = new DadosDataContext())
                    {
                        dados.CommandTimeout = 300;
                        var query = from c in dados.G010s join p in dados.G000s
                                    on c.G010_G000_ID equals p.G000_ID
                                    where p.flagcancelado == false 
                                    select new
                                    {
                                        c.G010_ID,
                                        c.G010_NOME,
                                        p.G000_DIA_VENCIMENTO_PADRAO
                                      
                                    };
                        List<XElement> elements = new List<XElement>();
                        foreach (var item in query)
                        {
                            elements.Add(new XElement("clientes",
                                new XElement("cod_cliente",item.G010_ID),
                                new XElement("cod_portador", "0341"),
                                new XElement("des_Nome_abreviado", item.G010_NOME),
                                new XElement("des_Nome", item.G010_NOME),
                                new XElement("cod_cond_pagamento", "1"),
                                new XElement("des_condicao", "22")));
                        }
                            xsefaz = new XDocument(
                                new XElement("SivaCob", elements
                                    )
                                );
                        
                    }
                    //XML pronto
                    string xml = xsefaz.ToString().Replace("\r\n", "");
    
                    //Salvando XML
                    xsefaz.Save(@"C:\Users\Ariel\Desktop\XML\abc1.xml");
                }
                catch (FormatException erro)
                {
                    throw new FormatException("Erro 01: " + erro.Message);
                }
                catch (EvaluateException erro)
                {
                    throw new EvaluateException("Erro 02: " + erro.Message);
                }
                catch (Exception erro)
                {
                    throw new Exception("Erro 03: " + erro.Message);
                }
            }

    O xml gerado por este código:

    <?xml version="1.0" encoding="utf-8"?>
    <SivaCob>
      <clientes>
        <cod_cliente>3172</cod_cliente>
        <cod_portador>0341</cod_portador>
        <des_Nome_abreviado>ALEXANDRE AP SILVA HOLANDA</des_Nome_abreviado>
        <des_Nome>ALEXANDRE AP SILVA HOLANDA</des_Nome>
        <cod_cond_pagamento>1</cod_cond_pagamento>
        <des_condicao>22</des_condicao>
      </clientes>
      <clientes>
        <cod_cliente>3173</cod_cliente>
        <cod_portador>0341</cod_portador>
        <des_Nome_abreviado>PATRICIA BORIN</des_Nome_abreviado>
        <des_Nome>PATRICIA BORIN</des_Nome>
        <cod_cond_pagamento>1</cod_cond_pagamento>
        <des_condicao>22</des_condicao>
      </clientes>
      <clientes>
        <cod_cliente>3174</cod_cliente>
        <cod_portador>0341</cod_portador>
        <des_Nome_abreviado>SUELI  CARVALHO SILVA </des_Nome_abreviado>
        <des_Nome>SUELI  CARVALHO SILVA </des_Nome>
        <cod_cond_pagamento>1</cod_cond_pagamento>
        <des_condicao>22</des_condicao>
      </clientes>

    Veja que ficou identado, quando na verdade deveria ter 3 linhas, uma pra cada cliente...eu tirei os XAttributes e coloquei XElements. Alguma outra idéia?? Obrigado pela ajuda!

    terça-feira, 14 de fevereiro de 2012 15:39
  • Sua duvida eu consegui entender, mais você chegou a ver como ficou o valor na variavel xml
    ??

    Outra duvida, este software que você esta fazendo integração só aceita XML neste formato que você quer ?? o fato de estar identado esta provocando algum erro no sistema ??

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    terça-feira, 14 de fevereiro de 2012 15:52
  • Sua duvida eu consegui entender, mais você chegou a ver como ficou o valor na variavel xml
    ??

    Outra duvida, este software que você esta fazendo integração só aceita XML neste formato que você quer ?? o fato de estar identado esta provocando algum erro no sistema ??

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    Vitor, pelos meus testes a variável xml fica da mesma forma, com os espaços. Mas percebo que não a uso pra salvar (este código para salvar tinha pronto aqui). Para usar o resultado da variável xml, como eu procedo? As vezes na hora de salvar muda tudo.

    E o formato identado a empresa simplesmente diz que não serve e não dá motivos ¬¬' . Por isso to correndo atrás pra deixar na forma que eles pedem, pois me parece que eles querem ganhar tempo pedindo neste formato.

    Obrigado pela ajuda novamente!

    terça-feira, 14 de fevereiro de 2012 16:49
  • Ariel veja se isso te ajuda:

    string xml = xsefaz.ToString().Replace("\r\n", "");


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    Conseguimos aqui! Ficou assim:

            public void Gera_XML_Total()
            {
                try 
                {
                    using (dados = new DadosDataContext())
                    {
                        dados.CommandTimeout = 300;
                        var query = from c in dados.G010s
                                    join p in dados.G000s
                                        on c.G010_G000_ID equals p.G000_ID
                                    where p.flagcancelado == false
                                    select new
                                    {
                                        c.G010_ID,
                                        c.G010_NOME,
                                        p.G000_DIA_VENCIMENTO_PADRAO
    
                                    };
                        List<XElement> clientes = new List<XElement>();
    
                        foreach (var item in query)
                        {
                            clientes.Add(new XElement("clientes",
                                new XElement("cod_cliente", item.G010_ID),
                                new XElement("cod_portador", "0341"),
                                new XElement("des_Nome_abreviado", item.G010_NOME),
                                new XElement("des_Nome", item.G010_NOME),
                                new XElement("cod_cond_pagamento", "1"),
                                new XElement("des_condicao", "22")));
                        }
    
                        string caminho = @"C:\Users\Ariel\Desktop\XML\abc1.xml";
                        using (FileStream fsRemessa =
                                       new FileStream(caminho, FileMode.Create, FileAccess.Write))
                        {
                            using (StreamWriter sw = new StreamWriter(fsRemessa))
                            {
    
                                string xml = "<xml>\r\n";
                                foreach (var item in clientes.ToList())
                                {
                                    xml += item.ToString().Replace("\r\n", "").Replace(" ", "").Trim();
    
    
                                    sw.WriteLine(xml);
    
    
    
    
                                    xml = String.Empty;
                                }
    
    
                                xml += "</xml>";
    
                                sw.WriteLine(xml);
    
                            }
    
                        }
    
    
    
                    }
                            
                }
                catch (FormatException erro)
                {
                    throw new FormatException("Erro 01: " + erro.Message);
                }
                catch (EvaluateException erro)
                {
                    throw new EvaluateException("Erro 02: " + erro.Message);
                }
                catch (Exception erro)
                {
                    throw new Exception("Erro 03: " + erro.Message);
                }
            }

    Ficou completamente diferente do que você postou Vitor, mas sua ajuda nos levou a pensar diferente aqui e chegamos nessa conclusão. Obrigado!!

    • Marcado como Resposta Ariel de Souza terça-feira, 14 de fevereiro de 2012 18:52
    terça-feira, 14 de fevereiro de 2012 18:52
  • Eu cheguei a pensar nisto, mais eu estava tentando montar este mesmo resultado LINQ, como estou um pouco enrolado nao deu para dar continuidade eu pensava e fazer em casa.

    Ainda bem que você conseguiu, é isso ai cara =D

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    terça-feira, 14 de fevereiro de 2012 18:57
  • Muito obrigado pela ajuda!!
    terça-feira, 14 de fevereiro de 2012 19:41