Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer Xml con TXMLDocument (delphi 11) no avanza de nodo (https://www.clubdelphi.com/foros/showthread.php?t=96144)

IVAND 04-03-2023 00:35:26

Leer Xml con TXMLDocument (delphi 11) no avanza de nodo
 
1 Archivos Adjunto(s)
Hola a todos , tengo un problema , no puedo hacer que se pueda leer un nodo de este xml , siempre lee el mismo valor de un nodo hijo
Ejemplo
Cita:

<detalles>
<detalle>
<descripcion>BIG COLA PET NO RETORNABLE 2250 ml 6 pack</descripcion>
<detallesAdicionales>
<detAdicional nombre="dato" valor="2.38"/>
<detAdicional nombre="dato" valor="2.64"/>
<detAdicional nombre="dato" valor="0.60"/>
</detallesAdicionales>
<impuestos>
<impuesto>
<codigo>3</codigo>
<codigoPorcentaje>3051</codigoPorcentaje>
<tarifa>10.00</tarifa>
<baseImponible>23.81</baseImponible>
<valor>2.38</valor>
</impuesto>
<impuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<tarifa>12</tarifa>
<baseImponible>22.01</baseImponible>
<valor>2.64</valor>
</impuesto>
</impuestos>
</detalle>
<detalle>
<descripcion>COLA PET RETORNABLE 2250 ml 6 pack</descripcion>
<detallesAdicionales>
<detAdicional nombre="dato" valor="2.38"/>
<detAdicional nombre="dato" valor="2.64"/>
<detAdicional nombre="dato" valor="0.60"/>
</detallesAdicionales>
<impuestos>
<impuesto>
<codigo>3</codigo>
<codigoPorcentaje>3051</codigoPorcentaje>
<tarifa>15.00</tarifa>
<baseImponible>23.81</baseImponible>
<valor>2.38</valor>
</impuesto>
<impuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<tarifa>16</tarifa>
<baseImponible>122.01</baseImponible>
<valor>12.64</valor>
</impuesto>
</impuestos>
</detalle>
</detalles>
Lee la BIG COLA PET NO RETORNABLE 2250 ml 6 pack y los impuestos (primer parrafo) , luego lee el segundo bloque COLA PET RETORNABLE 2250 ml 6 pack
y me vuelve a leer el valor del primer impuesto cuando deberia leer el impuesto que correspone al producto COLA PET RETORNABLE 2250 ml 6 pack
Espero me entiendan gracias, seguro sera algo sencillo pero no he podido

Código Delphi [-]
          for i := 0 to MainNode.ChildNodes['detalles'].ChildNodes.Count-1 do
          Begin
              CustomerNode := MainNode.ChildNodes['detalles'].ChildNodes[i];
              showmessage(CustomerNode.ChildNodes['descripcion'].text);
                 for j := 0 to MainNode.ChildNodes['detalles'].ChildNodes['detalle'].ChildNodes['impuestos'].ChildNodes.Count-1 do
                  Begin
                    CustomerNode1:=MainNode.ChildNodes['detalles'].ChildNodes['detalle'].ChildNodes['impuestos'].ChildNodes[j];
                    showmessage(CustomerNode1.ChildNodes['baseImponible'].text);
               //                       CustomerNode1.NextSibling ;
                  End;
          End;
Adjunto xml

como pueden ver el sistema pasa siempre por el nodo descripcion , pero dentro de ese nodo existe otro nodo , lo lee pero cuando lee el siguiente registro el nodo segundo (customedNode1) no avanza al siguiente registro y se queda siempre leyendo el mismo valor

JCz 04-03-2023 12:14:34

Buen Dia
Prueba cambiando esta linea
Código PHP:

CustomerNode := MainNode.ChildNodes['detalles'].ChildNodes[i]; 

por esta otra
Código PHP:

CustomerNode := MainNode.ChildNodes['detalle'].ChildNodes[i]; 


JCz 04-03-2023 12:52:21

Cita:

Empezado por IVAND (Mensaje 550646)
Hola a todos , tengo un problema , no puedo hacer que se pueda leer un nodo de este xml , siempre lee el mismo valor de un nodo hijo
Ejemplo


Lee la BIG COLA PET NO RETORNABLE 2250 ml 6 pack y los impuestos (primer parrafo) , luego lee el segundo bloque COLA PET RETORNABLE 2250 ml 6 pack
y me vuelve a leer el valor del primer impuesto cuando deberia leer el impuesto que correspone al producto COLA PET RETORNABLE 2250 ml 6 pack
Espero me entiendan gracias, seguro sera algo sencillo pero no he podido

Código Delphi [-]
          for i := 0 to MainNode.ChildNodes['detalles'].ChildNodes.Count-1 do
          Begin
              CustomerNode := MainNode.ChildNodes['detalles'].ChildNodes[i];
              showmessage(CustomerNode.ChildNodes['descripcion'].text);
                 for j := 0 to MainNode.ChildNodes['detalles'].ChildNodes['detalle'].ChildNodes['impuestos'].ChildNodes.Count-1 do
                  Begin
                    CustomerNode1:=MainNode.ChildNodes['detalles'].ChildNodes['detalle'].ChildNodes['impuestos'].ChildNodes[j];
                    showmessage(CustomerNode1.ChildNodes['baseImponible'].text);
               //                       CustomerNode1.NextSibling ;
                  End;
          End;
Adjunto xml

como pueden ver el sistema pasa siempre por el nodo descripcion , pero dentro de ese nodo existe otro nodo , lo lee pero cuando lee el siguiente registro el nodo segundo (customedNode1) no avanza al siguiente registro y se queda siempre leyendo el mismo valor


Leyendo bien la pregunta lo que necesitas es hacer esto
Código Delphi [-]
for i := 0 to MainNode.ChildNodes['detalles'].ChildNodes.Count-1 do
          Begin
              CustomerNode := MainNode.ChildNodes['detalles'].ChildNodes[i];
              showmessage(CustomerNode.ChildNodes['descripcion'].text);
                 for j := 0 to MainNode.ChildNodes['detalles'].ChildNodes['detalle'].ChildNodes['impuestos'].ChildNodes.Count-1 do
                  Begin
                    CustomerNode1:=MainNode.ChildNodes['detalles'].ChildNodes[i].ChildNodes['impuestos'].ChildNodes[j];
                    showmessage(CustomerNode1.ChildNodes['baseImponible'].text);

                  End;
          End;

con esta sentencia
Código PHP:

CustomerNode1:=MainNode.ChildNodes['detalles'].ChildNodes['detalle'].ChildNodes['impuestos'].ChildNodes[j]; 

siempre vas a leer el primero

IVAND 05-03-2023 18:34:10

Muy agradecido JCz , efectivamente funciono , gracias por el apoyo

duilioisola 06-03-2023 19:07:57

El for de impuestos debes hacerlo sobre el nodo que toque.
Podría fallar si un elemento tiene dos impuestos y otro solo uno.
Código Delphi [-]
// Recorro los nodos 
for i := 0 to MainNode.ChildNodes['detalles'].ChildNodes.Count-1 do
          Begin
              // Obtengo descripcion de este detalle
              CustomerNode := MainNode.ChildNodes['detalles'].ChildNodes[i];
              showmessage(CustomerNode.ChildNodes['descripcion'].text);

                 // Recorro los nodos  del nodo .
                 for j := 0 to MainNode.ChildNodes['detalles'].ChildNodes[i].ChildNodes['impuestos'].Count-1 do { MainNode.ChildNodes['detalles'].ChildNodes**[i]** }
                  Begin
                    CustomerNode1:= MainNode.ChildNodes['detalles'].ChildNodes[i].ChildNodes['impuestos'].ChildNodes[j];
                    showmessage(CustomerNode1.ChildNodes['baseImponible'].text);
                  End;
          End;

Pero para hacerlo mas entendible yo lo reformatearía así:
Código Delphi [-]
// Recorro los nodos  del nodo < detalles >
NodoDetalles := MainNode.ChildNodes['detalles'];
for i := 0 to NodoDetalles.ChildNodes.Count-1 do
Begin
  // Obtengo el nodo < detalle >
  NodoDetalle := NodoDetalles.ChildNodes[i];

  // Aquí habría que comprobar que exista el nodo < descripcion > dentro de < detalle >
  showmessage(NodoDetalle.ChildNodes['descripcion'].text);

  // Recorro los nodos < impuesto > del nodo < detalles >< impuestos >.
  for j := 0 to NodoDetalle.ChildNodes['impuestos'].Count-1 do
  Begin
    // De cada impuesto obtengo el nodo < baseImponible >
    NodoImpuesto := NodoDetalles.ChildNodes[j];
    showmessage(NodoImpuesto.ChildNodes['baseImponible'].text);
  End;
End;

IVAND 09-03-2023 03:12:31

Gracias , si efectivamente asi quedo ,

Nuevamente gracias a todos por su apoyo


La franja horaria es GMT +2. Ahora son las 12:10:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi