Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-03-2023
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Leer Xml con TXMLDocument (delphi 11) no avanza de nodo

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
Archivos Adjuntos
Tipo de Archivo: rar ivan4.rar (5,9 KB, 4 visitas)
__________________
IVAND

Última edición por Casimiro Notevi fecha: 04-03-2023 a las 11:24:27.
Responder Con Cita
  #2  
Antiguo 04-03-2023
JCz JCz is offline
Miembro
 
Registrado: oct 2021
Posts: 29
Poder: 0
JCz Va por buen camino
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]; 
Responder Con Cita
  #3  
Antiguo 04-03-2023
JCz JCz is offline
Miembro
 
Registrado: oct 2021
Posts: 29
Poder: 0
JCz Va por buen camino
Cita:
Empezado por IVAND Ver Mensaje
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
Responder Con Cita
  #4  
Antiguo 05-03-2023
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Muy agradecido JCz , efectivamente funciono , gracias por el apoyo
__________________
IVAND
Responder Con Cita
  #5  
Antiguo 06-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;

Última edición por duilioisola fecha: 06-03-2023 a las 19:12:06.
Responder Con Cita
  #6  
Antiguo 09-03-2023
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 21
IVAND Va por buen camino
Gracias , si efectivamente asi quedo ,

Nuevamente gracias a todos por su apoyo
__________________
IVAND
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
leer nodo tfd de un cfdi xml jourdan Varios 18 28-08-2018 22:04:12
Como leer nodo de archivo xml con Python usando minidom jourdan Python 3 09-02-2018 21:23:16
buscar el valor de un nodo en un TXMLDocument fcios OOP 5 07-02-2018 13:32:12
La ciencia avanza... que es una barbaridad... Casimiro Notevi La Taberna 9 11-08-2014 13:56:31
Por eso Mexico no avanza AzidRain La Taberna 18 17-03-2009 08:16:59


La franja horaria es GMT +2. Ahora son las 19:11:38.


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
Copyright 1996-2007 Club Delphi