none
Gerar XML de clientes para importar pelo NFE RRS feed

  • Pergunta

  • Olá, tenho o seguinte código:

       public class ClientesXML
        {
    
            DadosDataContext dados = null;
            DataTable dt = null;
            DataTable dt2 = null;
            DataSet ds = null;
            DataRow dr = null;
            private string CPF;
            private string xNome;
            private string xLgr;
            private int? nro;
            private int id;
            private string xCpl;
            private string xBairro;
            private string cMun;
            private string idmun;
            private string xMun;
            private string UF;
            private string CEP;
            private string bloco;
            private string apto;
            private string descricao;
    
            public void Le_Gera_Sefaz_XML()
            {
                try
                {
                    ds = new DataSet();
                    dt = new DataTable();
                    
                    ds.ReadXml(@"h:/Estudo/IntegracaoXML/estrutura_nfe.xml");
                    ds.Tables.Add(dt);
                    
                    List<ClientesXML> query = new List<ClientesXML>();
    
                    using (dados = new DadosDataContext())
                    
                    	query.AddRange(
                            (from c in dados.Clientes join p in dados.Condominios
                                                           on c.Clientes_Condominios_ID equals p.Condominios_ID
                                                           join u in dados.Estados
                                                           on c.Clientes_Estados_ID equals u.Estados_ID
                                                           where p.flagcancelado == false 
    
                                      select new ClientesXML
                                      {
                                         CPF = c.Clientes_CPF,
                                         xNome = c.Clientes_NOME,
                                         xLgr= c.Clientes_ENDERECO,
                                         nro = c.Clientes_NUMERO,
                                         bloco = ((from t in dados.Blocos where t.Blocos_Condominios_ID==c.Clientes_Blocos_ID select t.Blocos_DESCRICAO).ToString()),
                                         apto = c.Clientes_apartamento,
                                         xCpl = (c.Clientes_CORREIO == "0" ? "Apto " + apto + " Bloco " + bloco : "Apto 0 Bloco 0"),
                                         xBairro = c.Clientes_BAIRRO,
                                         idmun = ((from m in dados.tbMunicipios where m.Descricao==c.Clientes_CIDADE select m.idMunicipio).ToString()),
                                         descricao = ((from m in dados.tbMunicipios where m.Descricao==c.Clientes_CIDADE select m.Descricao).ToString()),
                                         cMun = (c.Clientes_CIDADE == descricao ? idmun :  "0"),
                                         xMun = c.Clientes_CIDADE,
                                         UF = u.Estados_UF,
                                         CEP = c.Clientes_CEP
                                      }).Distinct()
                         );
    
                    foreach (var item in query)
                    {
                        dr = ds.Tables[1].NewRow();
                        dr[0] = item.CPF;
                        dr[1] = item.xNome;
                        ds.Tables[1].Rows.Add(dr);
                        dr = ds.Tables[2].NewRow();
                        dr[0] = item.xLgr;
                        dr[1] = item.nro;
                        dr[2] = item.xCpl;
                        dr[3] = item.xBairro;
                        dr[4] = item.cMun;
                        dr[5] = item.xMun;
                        dr[6] = item.UF;
                        dr[7] = item.CEP;
                        dr[8] = "1058";
                        dr[9] = "BRASIL";
                        ds.Tables[2].Rows.Add(dr);
                    } 
                    
                    ds.WriteXml(@"h:/Estudo/IntegracaoXML/Clientes_sefaz.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);
                }
                finally
                {
                    ds.Dispose();
                    //dt.Dispose();
                }
            }
    
    

    Estou lendo um xml gerado pelo NFE para "capturar" o formato do xml, e assim adicionar novos dados dentro deste esquema. Mas ele está gerando primeiro todos os destinatários e depois em separados os endereços de cada um. Alguém tem uma maneira mais simples de gerar um xml com meus clientes, vindo de meu banco de dados para ler no NFE ou alguma solução para este código?

    sexta-feira, 20 de janeiro de 2012 17:29

Respostas

  • Eu particulamento gosto de trabalhar com LINQ to XML para criação de XML, brincando aqui cheguei a este resultado:



    Código C#:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    using System.Xml.Linq;
    using System.Xml;
    using System.Xml.Schema;
    using System.IO;
    
    namespace ConsoleApplication3
    {
        class Program
        {
            class Pedido
            {
                public int NumeroPedido { get; set; }
                public string NomeCliente { get; set; }
                public List<ItensDePedido> ItemDePedidos { get; set; }
            }
    
            class ItensDePedido
            {
                public int IdPedido { get; set; }
                public int IdItensDePedido { get; set; }
                public string Produto { get; set; }
            }
    
            static void Main(string[] args)
            {
                //Criando lista de pedidos
                List<Pedido> lista = new List<Pedido>
                    {
                        new Pedido
                        {
                            NumeroPedido = 1, 
                            NomeCliente="Bruno",
                            ItemDePedidos = new List<ItensDePedido>
                            {
                                new ItensDePedido{IdPedido=1,Produto="Bolacha1",IdItensDePedido=34},
                                new ItensDePedido{IdPedido=1,Produto="Bolacha2",IdItensDePedido=32},
                                new ItensDePedido{IdPedido=1,Produto="Bolacha3",IdItensDePedido=31},
                                new ItensDePedido{IdPedido=1,Produto="Bolacha4",IdItensDePedido=33}
                            }
                        },
                        new Pedido
                        {
                            NumeroPedido = 2, 
                            NomeCliente="Aline",
                            ItemDePedidos = new List<ItensDePedido>
                            {
                                new ItensDePedido{IdPedido=2,Produto="Suco1",IdItensDePedido=12},
                                new ItensDePedido{IdPedido=2,Produto="Suco2",IdItensDePedido=15},
                                new ItensDePedido{IdPedido=2,Produto="Suco3",IdItensDePedido=18}
                            }
                        }
                    };
    
                //Criando XML
                XDocument xDoc = new XDocument(
                    new XElement("ListaPedidosCliente",
                        lista.Select(f =>
                            new XElement("Pedido", new XAttribute("NomeCliente", f.NomeCliente), new XAttribute("NumeroPedido", f.NumeroPedido),
                                new XElement("ItemDePedidos", f.ItemDePedidos.Select(o =>
                                    new XElement("Item", new XAttribute("IdItensDePedido", o.IdItensDePedido), new XAttribute("IdPedido", o.IdPedido), new XAttribute("Produto", o.Produto))
                                    )
                                )
                            )
                        )
                    )
                );
    
                //XML pronto
                string xml = xDoc.ToString();
    
                //Salvando XML
                xDoc.Save(@"C:\abc.xml");
            }
    
        }
    }
    


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    sexta-feira, 20 de janeiro de 2012 18:08
  • A solução mais simples é usar o XMLSerializable.

    Basicamente você vai mapear o XML em cima de uma classe e utilizar a class XMLSerializable para transforma o XML em Class ou Vice-Versa.

     

    Exemplo retirado de http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

    Classe em C# que representa o XML mapeado.

    public class Movie
    {
      [XmlElement("MovieName")]
      public string Title
      { get; set; }
    
      [XmlElement("MovieRating")]
      public float Rating
      { get; set; }
    
      [XmlElement("MovieReleaseDate")]
      public DateTime ReleaseDate
      { get; set; }
    }
    

    Como esta classe irá ficar em XML.

    <?xml version="1.0" encoding="utf-8"?>
    <Movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <MovieName>Starship Troopers</MovieName>
      <MovieRating>6.9</MovieRating>
      <MovieReleaseDate>1997-11-07T00:00:00</MovieReleaseDate>
    </Movie>
    

    Código para Deserializar o XML desta classe.

    static List<Movie> DeserializeFromXML()
    {
       XmlSerializer deserializer = new XmlSerializer(typeof(List<Movie>));
       TextReader textReader = new StreamReader(@"C:\movie.xml");
       List<Movie> movies; 
       movies = (List<Movie>)deserializer.Deserialize(textReader);
       textReader.Close();
    
       return movies;
    }
    

    Ou seja em movies você tem toda a classe preenchida com os valores corretos desde que mapeados corretamente.

     

    Segue abaixo alguns links para você.

    http://support.microsoft.com/kb/815813

    http://www.codeproject.com/Articles/4491/Load-and-save-objects-to-XML-using-serialization

    http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

    http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

    sábado, 21 de janeiro de 2012 23:43
  • Consegui resolver a alguns dias, postando pra quem tiver dificuldades, vai saber...

            public void Le_Gera_Sefaz_XML()
            {
                try
                {
                    using (dados = new DadosDataContext())
                    {
    
                        dados.CommandTimeout = 300;
                        //var query = dados.SP_BuscaClienteNFE(5, null);
    
                        //List<ClientesXML> query = new List<ClientesXML>();
    
                        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
                             join u in dados.G150s
                             on c.G010_G150_ID equals u.G150_ID
                             join t in dados.G001s
                             on c.G010_G001_ID equals t.G001_ID
                             join mun in dados.Logradouro1s
                             on c.G010_CEP.Replace("-", "") equals mun.CEP8_LOG
                             where p.flagcancelado == false && p.idpraca == 5
    
                             select new ClientesXML
                             {
                                 CPF = c.G010_CPF,
                                 xNome = c.G010_NOME,
                                 xLgr = c.G010_ENDERECO,
                                 nro = c.G010_NUMERO,
                                 xCpl = (c.G010_CORREIO.Equals("0") ? String.Format("Apto {0} Bloco {1}", c.G010_PESQUISA_RAPIDA, t.G001_DESCRICAO) : "Apto 0 Bloco 0"),
                                 xBairro = c.G010_BAIRRO,
                                 cMun = mun.CHVLOCAL_LOG,//(c.G010_CEP.Replace("-","") == mun.CEP8_LOG ? mun.CHVLOCAL_LOG : "0"),
                                 xMun = c.G010_CIDADE,
                                 UF = u.G150_UF,
                                 CEP = c.G010_CEP
                             });
                             
    
                        List<XElement> elements = new List<XElement>();
                        foreach (var item in query)
                        {
                            elements.Add(new XElement("dest",
                                        new XElement("CPF", item.CPF.Replace("-", "").Replace("/", "").Replace(".", "")),
                                        new XElement("xNome", item.xNome.Trim()),
                                        new XElement("enderDest",
                                            new XElement("xLgr", item.xLgr.Trim()),
                                            new XElement("nro", item.nro),
                                            new XElement("xCpl", item.xCpl.Trim()),
                                            new XElement("xBairro", item.xBairro.Trim()),
                                            new XElement("cMun", item.cMun),
                                            new XElement("xMun", item.xMun.Trim()),
                                            new XElement("UF", item.UF.Trim()),
                                            new XElement("CEP", item.CEP.Replace("-","").Trim()),
                                            new XElement("cPais", "1058"),
                                            new XElement("xPais", "BRASIL")
                                            )));
                        }
    
                        //foreach (var item in query)
                        //{
                            xsefaz = new XDocument(
                                new XElement("sistema", elements
                                    )
                                );
                        //}
                    }
                    //XML pronto
                    string xml = xsefaz.ToString();
    
                    //Salvando XML
                    xsefaz.Save(@"C:\Users\Ariel\Desktop\XML\abc.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);
                }
                finally
                {
                    //ds.Dispose();
                    //dt.Dispose();
                }
            }

    Com isso gerei tudo certinho, mas como o cadastro do banco de dados que trabalho tá uma zona, sem cadastros validados, não pude continuar. Mas pra quem precisar criar o schema do NFE tá aí a forma de se fazer. Obrigado a quem ajudou, abraços!

    • Marcado como Resposta Ariel de Souza sexta-feira, 10 de fevereiro de 2012 15:47
    sexta-feira, 10 de fevereiro de 2012 15:47

Todas as Respostas

  • Eu particulamento gosto de trabalhar com LINQ to XML para criação de XML, brincando aqui cheguei a este resultado:



    Código C#:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Configuration;
    using System.Xml.Linq;
    using System.Xml;
    using System.Xml.Schema;
    using System.IO;
    
    namespace ConsoleApplication3
    {
        class Program
        {
            class Pedido
            {
                public int NumeroPedido { get; set; }
                public string NomeCliente { get; set; }
                public List<ItensDePedido> ItemDePedidos { get; set; }
            }
    
            class ItensDePedido
            {
                public int IdPedido { get; set; }
                public int IdItensDePedido { get; set; }
                public string Produto { get; set; }
            }
    
            static void Main(string[] args)
            {
                //Criando lista de pedidos
                List<Pedido> lista = new List<Pedido>
                    {
                        new Pedido
                        {
                            NumeroPedido = 1, 
                            NomeCliente="Bruno",
                            ItemDePedidos = new List<ItensDePedido>
                            {
                                new ItensDePedido{IdPedido=1,Produto="Bolacha1",IdItensDePedido=34},
                                new ItensDePedido{IdPedido=1,Produto="Bolacha2",IdItensDePedido=32},
                                new ItensDePedido{IdPedido=1,Produto="Bolacha3",IdItensDePedido=31},
                                new ItensDePedido{IdPedido=1,Produto="Bolacha4",IdItensDePedido=33}
                            }
                        },
                        new Pedido
                        {
                            NumeroPedido = 2, 
                            NomeCliente="Aline",
                            ItemDePedidos = new List<ItensDePedido>
                            {
                                new ItensDePedido{IdPedido=2,Produto="Suco1",IdItensDePedido=12},
                                new ItensDePedido{IdPedido=2,Produto="Suco2",IdItensDePedido=15},
                                new ItensDePedido{IdPedido=2,Produto="Suco3",IdItensDePedido=18}
                            }
                        }
                    };
    
                //Criando XML
                XDocument xDoc = new XDocument(
                    new XElement("ListaPedidosCliente",
                        lista.Select(f =>
                            new XElement("Pedido", new XAttribute("NomeCliente", f.NomeCliente), new XAttribute("NumeroPedido", f.NumeroPedido),
                                new XElement("ItemDePedidos", f.ItemDePedidos.Select(o =>
                                    new XElement("Item", new XAttribute("IdItensDePedido", o.IdItensDePedido), new XAttribute("IdPedido", o.IdPedido), new XAttribute("Produto", o.Produto))
                                    )
                                )
                            )
                        )
                    )
                );
    
                //XML pronto
                string xml = xDoc.ToString();
    
                //Salvando XML
                xDoc.Save(@"C:\abc.xml");
            }
    
        }
    }
    


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    sexta-feira, 20 de janeiro de 2012 18:08
  • A solução mais simples é usar o XMLSerializable.

    Basicamente você vai mapear o XML em cima de uma classe e utilizar a class XMLSerializable para transforma o XML em Class ou Vice-Versa.

     

    Exemplo retirado de http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

    Classe em C# que representa o XML mapeado.

    public class Movie
    {
      [XmlElement("MovieName")]
      public string Title
      { get; set; }
    
      [XmlElement("MovieRating")]
      public float Rating
      { get; set; }
    
      [XmlElement("MovieReleaseDate")]
      public DateTime ReleaseDate
      { get; set; }
    }
    

    Como esta classe irá ficar em XML.

    <?xml version="1.0" encoding="utf-8"?>
    <Movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <MovieName>Starship Troopers</MovieName>
      <MovieRating>6.9</MovieRating>
      <MovieReleaseDate>1997-11-07T00:00:00</MovieReleaseDate>
    </Movie>
    

    Código para Deserializar o XML desta classe.

    static List<Movie> DeserializeFromXML()
    {
       XmlSerializer deserializer = new XmlSerializer(typeof(List<Movie>));
       TextReader textReader = new StreamReader(@"C:\movie.xml");
       List<Movie> movies; 
       movies = (List<Movie>)deserializer.Deserialize(textReader);
       textReader.Close();
    
       return movies;
    }
    

    Ou seja em movies você tem toda a classe preenchida com os valores corretos desde que mapeados corretamente.

     

    Segue abaixo alguns links para você.

    http://support.microsoft.com/kb/815813

    http://www.codeproject.com/Articles/4491/Load-and-save-objects-to-XML-using-serialization

    http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization

    http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

    sábado, 21 de janeiro de 2012 23:43
  • Neste seu exemplo, se eu entendi bem, está adicionando elemento por elemento, enquanto eu precis adicionar do que vem do banco de dados e são mais de 30 mil clientes...

    Eu consigo gerar, mas no meu código ele gera primeiro os clientes e depois os endereços deles, de forma separada, enquanto os endereços de cada cliente deveriam ficar dentro dos destinatários, como um nó filho de destinatário, como está no código que postei.

    Entende?

    segunda-feira, 23 de janeiro de 2012 11:16
  • Augusto, neste caso tenho que ler o xml que contém a estrutura antes e assim mapeá-lo ou isso não se faz necessário?
    segunda-feira, 23 de janeiro de 2012 11:28
  • Consegui resolver a alguns dias, postando pra quem tiver dificuldades, vai saber...

            public void Le_Gera_Sefaz_XML()
            {
                try
                {
                    using (dados = new DadosDataContext())
                    {
    
                        dados.CommandTimeout = 300;
                        //var query = dados.SP_BuscaClienteNFE(5, null);
    
                        //List<ClientesXML> query = new List<ClientesXML>();
    
                        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
                             join u in dados.G150s
                             on c.G010_G150_ID equals u.G150_ID
                             join t in dados.G001s
                             on c.G010_G001_ID equals t.G001_ID
                             join mun in dados.Logradouro1s
                             on c.G010_CEP.Replace("-", "") equals mun.CEP8_LOG
                             where p.flagcancelado == false && p.idpraca == 5
    
                             select new ClientesXML
                             {
                                 CPF = c.G010_CPF,
                                 xNome = c.G010_NOME,
                                 xLgr = c.G010_ENDERECO,
                                 nro = c.G010_NUMERO,
                                 xCpl = (c.G010_CORREIO.Equals("0") ? String.Format("Apto {0} Bloco {1}", c.G010_PESQUISA_RAPIDA, t.G001_DESCRICAO) : "Apto 0 Bloco 0"),
                                 xBairro = c.G010_BAIRRO,
                                 cMun = mun.CHVLOCAL_LOG,//(c.G010_CEP.Replace("-","") == mun.CEP8_LOG ? mun.CHVLOCAL_LOG : "0"),
                                 xMun = c.G010_CIDADE,
                                 UF = u.G150_UF,
                                 CEP = c.G010_CEP
                             });
                             
    
                        List<XElement> elements = new List<XElement>();
                        foreach (var item in query)
                        {
                            elements.Add(new XElement("dest",
                                        new XElement("CPF", item.CPF.Replace("-", "").Replace("/", "").Replace(".", "")),
                                        new XElement("xNome", item.xNome.Trim()),
                                        new XElement("enderDest",
                                            new XElement("xLgr", item.xLgr.Trim()),
                                            new XElement("nro", item.nro),
                                            new XElement("xCpl", item.xCpl.Trim()),
                                            new XElement("xBairro", item.xBairro.Trim()),
                                            new XElement("cMun", item.cMun),
                                            new XElement("xMun", item.xMun.Trim()),
                                            new XElement("UF", item.UF.Trim()),
                                            new XElement("CEP", item.CEP.Replace("-","").Trim()),
                                            new XElement("cPais", "1058"),
                                            new XElement("xPais", "BRASIL")
                                            )));
                        }
    
                        //foreach (var item in query)
                        //{
                            xsefaz = new XDocument(
                                new XElement("sistema", elements
                                    )
                                );
                        //}
                    }
                    //XML pronto
                    string xml = xsefaz.ToString();
    
                    //Salvando XML
                    xsefaz.Save(@"C:\Users\Ariel\Desktop\XML\abc.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);
                }
                finally
                {
                    //ds.Dispose();
                    //dt.Dispose();
                }
            }

    Com isso gerei tudo certinho, mas como o cadastro do banco de dados que trabalho tá uma zona, sem cadastros validados, não pude continuar. Mas pra quem precisar criar o schema do NFE tá aí a forma de se fazer. Obrigado a quem ajudou, abraços!

    • Marcado como Resposta Ariel de Souza sexta-feira, 10 de fevereiro de 2012 15:47
    sexta-feira, 10 de fevereiro de 2012 15:47