none
Aumentar Varios Nodos A un xml Existente RRS feed

  • Pregunta

  • <ventas>

    <detalleVentas>
    <tpIdCliente>06</tpIdCliente>
    <idCliente>PE0936248</idCliente>
    <parteRelVtas>NO</parteRelVtas>
    <tipoComprobante>18</tipoComprobante>
    <tipoEmision>E</tipoEmision>
    <numeroComprobantes>1</numeroComprobantes>
    <baseNoGraIva>0.00</baseNoGraIva>
    <baseImponible>0.00</baseImponible>
    <baseImpGrav>30.00</baseImpGrav>
    <montoIva>3.60</montoIva>
    <montoIce>0.00</montoIce>
    <valorRetIva>0.00</valorRetIva>
    <valorRetRenta>0.00</valorRetRenta>
    </detalleVentas>
    <detalleVentas>
    <tpIdCliente>06</tpIdCliente>
    <idCliente>PP25296652</idCliente>
    <parteRelVtas>NO</parteRelVtas>
    <tipoComprobante>18</tipoComprobante>
    <tipoEmision>E</tipoEmision>
    <numeroComprobantes>1</numeroComprobantes>
    <baseNoGraIva>0.00</baseNoGraIva>
    <baseImponible>0.00</baseImponible>
    <baseImpGrav>10.00</baseImpGrav>
    <montoIva>1.20</montoIva>
    <montoIce>0.00</montoIce>
    <valorRetIva>0.00</valorRetIva>
    <valorRetRenta>0.00</valorRetRenta>
    </detalleVentas>
    <detalleVentas>
    <tpIdCliente>06</tpIdCliente>
    <idCliente>YA661282</idCliente>
    <parteRelVtas>NO</parteRelVtas>
    <tipoComprobante>18</tipoComprobante>
    <tipoEmision>E</tipoEmision>
    <numeroComprobantes>1</numeroComprobantes>
    <baseNoGraIva>0.00</baseNoGraIva>
    <baseImponible>0.00</baseImponible>
    <baseImpGrav>25.00</baseImpGrav>
    <montoIva>3.00</montoIva>
    <montoIce>0.00</montoIce>
    <valorRetIva>0.00</valorRetIva>
    <valorRetRenta>0.00</valorRetRenta>
    <formasDePago>
    <formaPago>20</formaPago>
    </formasDePago>
    </detalleVentas>

    </ventas>

    con este codigo puedo aumentar solo en el ultio elemento 

       XmlDocument doc = new XmlDocument();
                string value = File.ReadAllText(@"D:\AcompaPruebaATS.xml");
                doc.LoadXml(value);
                XmlNodeList nodos;
                XmlNode root = doc.DocumentElement;
                nodos = root.SelectNodes(@"ventas/detalleVentas");
                XmlElement elem = doc.CreateElement("formasDePago");
                XmlElement formaas = doc.CreateElement("formaPago");
                formaas.InnerText = "20";
                elem.AppendChild(formaas);



                foreach (XmlNode node in nodos)
                {
                    // node.ParentNode.InsertAfter(elem, node);
                    node.AppendChild(elem);

                }

    como puedo aumrntar en todos los nodos 

             XmlElement elem = doc.CreateElement("formasDePago");
                XmlElement formaas = doc.CreateElement("formaPago");

    por favor AYUDA :(

    domingo, 22 de octubre de 2017 7:13

Respuestas

  • Viendo la forma en la que has intentado programarlo, estás pensando en el nodo como si fuera "texto", y con un bucle estás intentando añadir ese texto a todos los nodos. Pero cuando haces un "CreateElement", desde el punto de vista del XmlDocument no es un texto, sino un objeto especializado que representa un nodo concreto. Y ese "nodo concreto" solo puede estar en un único sitio del árbol XML. En otra palabras, si usas un bucle para añadirlo en varios sitios, lo que hace es irlo moviendo y se queda en el último sitio en el que lo agregaste.

    En resumidas cuentas, tienes que repetir los CreateElement dentro del bucle, antes de hacer el AppendChild. No vale con crearlo una única vez antes del bucle y luego intentarlo añadir varias veces.

    • Propuesto como respuesta Jorge TurradoMVP domingo, 22 de octubre de 2017 10:59
    • Marcado como respuesta edwinwla13 domingo, 22 de octubre de 2017 19:27
    domingo, 22 de octubre de 2017 8:58
    Moderador

Todas las respuestas

  • Viendo la forma en la que has intentado programarlo, estás pensando en el nodo como si fuera "texto", y con un bucle estás intentando añadir ese texto a todos los nodos. Pero cuando haces un "CreateElement", desde el punto de vista del XmlDocument no es un texto, sino un objeto especializado que representa un nodo concreto. Y ese "nodo concreto" solo puede estar en un único sitio del árbol XML. En otra palabras, si usas un bucle para añadirlo en varios sitios, lo que hace es irlo moviendo y se queda en el último sitio en el que lo agregaste.

    En resumidas cuentas, tienes que repetir los CreateElement dentro del bucle, antes de hacer el AppendChild. No vale con crearlo una única vez antes del bucle y luego intentarlo añadir varias veces.

    • Propuesto como respuesta Jorge TurradoMVP domingo, 22 de octubre de 2017 10:59
    • Marcado como respuesta edwinwla13 domingo, 22 de octubre de 2017 19:27
    domingo, 22 de octubre de 2017 8:58
    Moderador
  • muchas gracias tienes toda la razon te agradezco

    domingo, 22 de octubre de 2017 19:28