Hola rudolfcruz nuevamente
Te comparto como lo hago yo, aunque lo hago de manera distinta a como lo expones en tu codigo, espero te sirva para darte una idea
Código:
W.WriteStartElement("cfdi:Conceptos");
//Nodo Conceptos
for (int zzzzZZZZ = 0; zzzzZZZZ < dataGridView_Productos.Rows.Count; zzzzZZZZ++)
{
//Se escribe nodo Concepto
W.WriteStartElement("cfdi:Concepto");
//Se escribe atributo Cantidad
W.WriteStartAttribute("cantidad");
W.WriteValue(dataGridView_Productos.Rows[zzzzZZZZ].Cells[0].Value);
W.WriteEndAttribute();
//Se escribe atributo Unidad
W.WriteStartAttribute("unidad");
W.WriteValue(dataGridView_Productos.Rows[zzzzZZZZ].Cells[1].Value);
W.WriteEndAttribute();
//Se escribe atributo SKU en caso que exista
if (dataGridView_Productos.Rows[zzzzZZZZ].Cells[2].Value.ToString() != "")
{
W.WriteStartAttribute("noIdentificacion");
W.WriteValue(dataGridView_Productos.Rows[zzzzZZZZ].Cells[2].Value);
W.WriteEndAttribute();
}
//Se escribe atributo descripcion
W.WriteStartAttribute("descripcion");
W.WriteValue(dataGridView_Productos.Rows[zzzzZZZZ].Cells[3].Value);
W.WriteEndAttribute();
//Se escribe atributo ValorUnitario
W.WriteStartAttribute("valorUnitario");
W.WriteValue(dataGridView_Productos.Rows[zzzzZZZZ].Cells[4].Value);
W.WriteEndAttribute();
//Se escribe atributo Importe
W.WriteStartAttribute("importe");
W.WriteValue(dataGridView_Productos.Rows[zzzzZZZZ].Cells[5].Value);
W.WriteEndAttribute();
//Se cierra el nodo
W.WriteEndElement();
}
W.WriteEndElement(); //Finaliza nodo Conceptos
Lo que yo hago es vaciar de un DataGridView que previamente la persona que esta haciendo el CFDi lleno con sus partidas.
Saluditos.