Usuário com melhor resposta
Xml com XElements na mesma linha??

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!
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
-
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
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
-
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! -
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/ -
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!
- Editado Ariel de Souza terça-feira, 14 de fevereiro de 2012 16:57
-
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
-
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 =DVitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -