I can give you a suggestion, do not mount the XML in your hand.
You can and should define a contract like the one below.
[DataContract(Name = "mensagemSNGPCInventario", Namespace = "urn:sngpc-schema")]
public class NotaFiscal
{
[DataMember(Name = "cabecalho", Order = 1)]
public Cabecalho Cabecalho { get; set; } = new Cabecalho();
[DataMember(Name = "corpo", Order = 2)]
public Corpo Corpo { get; set; } = new Corpo();
}
[DataContract(Name = "cabecalho", Namespace = "urn:sngpc-schema")]
public class Cabecalho
{
[DataMember(Name = "cnpjEmissor", Order = 1)]
public string CnpjEmissor { get; set; } = "12935236000107";
[DataMember(Name = "cpfTransmissor", Order = 2)]
public string CpfTransmissor { get; set; } = "01472346971";
[DataMember(Name = "data", Order = 3)]
public DateTime Data { get; set; } = new DateTime(2006, 1, 1);
}
[DataContract(Name = "corpo", Namespace = "urn:sngpc-schema")]
public class Corpo
{
[DataMember(Name = "medicamentos", Order = 1)]
public Medicamentos Medicamentos { get; set; } = new Medicamentos();
}
[CollectionDataContract(Name = "medicamentos", Namespace = "urn:sngpc-schema")]
public class Medicamentos : List<MedicamentoWrapper>
{
}
[DataContract(Name = "entradaMedicamentos", Namespace = "urn:sngpc-schema")]
public class MedicamentoWrapper
{
[DataMember(Name = "medicamentoEntrada", Order = 1)]
public Medicamento Medicamento { get; set; } = new Medicamento();
}
[DataContract(Name = "medicamentoEntrada", Namespace = "urn:sngpc-schema")]
public class Medicamento
{
[DataMember(Name = "classeTerapeutica", Order = 1)]
public string ClasseTerapeutica { get; set; }
[DataMember(Name = "registroMSMedicamento", Order = 2)]
public string RegistroMSMedicamento { get; set; } = "1888888888888";
[DataMember(Name = "numeroLoteMedicamento", Order = 3)]
public string NumeroLoteMedicamento { get; set; } = "AACCBB";
[DataMember(Name = "quantidadeMedicamento", Order = 4)]
public int QuantidadeMedicamento { get; set; } = 12;
[DataMember(Name = "unidadeMedidaMedicamento", Order = 5)]
public int UnidadeMedidaMedicamento { get; set; } = 1;
}
Then you can execute the following code:
var notaFiscal = new NotaFiscal();
var medicamentos = notaFiscal.Corpo.Medicamentos;
for (var indice = 0; indice < 10; indice++)
{
var medicamento = new MedicamentoWrapper();
medicamento.Medicamento.ClasseTerapeutica = Guid.NewGuid().ToString();
notaFiscal.Medicamentos.Add(medicamento);
}
var serializer = new DataContractSerializer(typeof(NotaFiscal));
var settings = new XmlWriterSettings
{
Encoding = Encoding.GetEncoding("ISO-8859-1"),
NewLineHandling = NewLineHandling.Entitize,
NewLineChars = Environment.NewLine,
Indent = true
};
using (var stream = new MemoryStream())
{
using (var writer = XmlDictionaryWriter.Create(stream, settings))
{
serializer.WriteObject(writer, notaFiscal);
}
using (var reader = new StreamReader(stream))
{
stream.Position = 0;
var xml = reader.ReadToEnd();
}
}
This will generate the following XML.:
<?xml version="1.0" encoding="utf-16"?>
<mensagemSNGPCInventario xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:sngpc-schema">
<cabecalho>
<cnpjEmissor>12935236000107</cnpjEmissor>
<cpfTransmissor>01472346971</cpfTransmissor>
<data>2006-01-01T00:00:00</data>
</cabecalho>
<corpo>
<medicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>a4eea288-e54e-413c-8a3a-290ac57c21fb</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>0550972b-de44-441e-ba22-b25be0d16e3f</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>183c17ec-2605-40fa-afc9-67bb1437e19d</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>c581eab3-39ec-44b9-a1d9-24d9f11c7ac9</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>90ee2e2b-ecae-4d0b-9637-3c1e638566df</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>724ef7e2-4f0c-464a-9687-f108cbe68410</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>83a6f068-b7d1-489e-a613-b8742e9161dd</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>19501ba5-2f8d-4959-b0b8-85ea0dea666f</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>28b1e29f-f947-4a4d-a654-d28687cbddc3</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
<entradaMedicamentos>
<medicamentoEntrada>
<classeTerapeutica>110aebac-f3a1-421b-8402-dc6830bedeeb</classeTerapeutica>
<registroMSMedicamento>1888888888888</registroMSMedicamento>
<numeroLoteMedicamento>AACCBB</numeroLoteMedicamento>
<quantidadeMedicamento>12</quantidadeMedicamento>
<unidadeMedidaMedicamento>1</unidadeMedidaMedicamento>
</medicamentoEntrada>
</entradaMedicamentos>
</medicamentos>
</corpo>
</mensagemSNGPCInventario>
If you want to write this XML to a file (as you are doing today), use File.WriteAllText
File.WriteAllText(filePath, xml);
If you just want to store the XML in memory, just modify the Writer you're using.
var binary = default(byte[]);
var serializer = new DataContractSerializer(typeof(NotaFiscal));
using (var stream = new MemoryStream())
{
using (var writer = XmlDictionaryWriter.CreateBinaryWriter(stream))
{
serializer.WriteObject(writer, notaFiscal);
stream.Position = 0;
stream.Flush();
binary = stream.ToArray();
}
}