Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Delphi para la web (https://www.clubdelphi.com/foros/forumdisplay.php?f=51)
-   -   Eliminar nodos vacios de un XML (https://www.clubdelphi.com/foros/showthread.php?t=97570)

seccion_31 09-07-2025 07:31:36

Eliminar nodos vacios de un XML
 
llevo una vida buscando como eliminar nodos vacíos de un archivo XML.

Tanto los nodos individuales que no tengan valores

Como una vez eliminados esos nodos individuales, los superiores que hayan quedado vacíos (o ya lo estuvieran) se eliminen también.

Es decir que al final en el XML solo queden nodos de cualquier nivel con valores,

Espero haberme explicado, y a ver si alguien puede darme una mano con esto !

(estoy probabando ahora un ultimo codigo a ver si me funciona)

saludos !

duilioisola 09-07-2025 18:44:36

Creo que podría hacerse con algo así:
no lo he probado

Código Delphi [-]
begin
  XMLDoc := TXMLDocument.Create(Self);
  try
     with XMLDoc do
     begin
        XML.LoadFromFile('ejemplo.xml');

        // Se activa para poder utilizar el componente
        Active := True;
        Encoding := 'utf-8';
        // Caracter para indentar el fichero XML
        NodeIndentStr := #8;

        // Elimino nodos vacios
        EliminaNodosVacios(NodoDocumentElement);
  [...]    
end;

function EstaVacio(Nodo: IXMLNode) : boolean;
var
  i : integer;
  NodoHijo : IXMLNode;
  Vacio : boolean;
begin
  /// Veo si el nodo tiene hijos vacios o si tiene contenido vacio

  Result := True;
  
  if Assigned(Nodo) do
  begin
     // Recorro hijos mirando si esta vacio
     for i := 0 to Nodo.ChildNodes.Count - 1 do
     begin
        if Result then
           Result := EstaVacio(Nodo.ChildNodes[i]);
     end;
     
     // Si no quedan hijos miro si tiene contenido
     if (not Nodo.HasChildNodes) then
     begin
       if (Nodo.Text <> '') then
          Vacio := False;
     end;
  end;
end;

procedure EliminarNodosVacios(Nodo: IXMLNode) : boolean;
var
  i : integer;
begin
  if Assigned(Nodo) do
  begin
     // Recorro hijos de atras hacia adelante, borrando los vacios
     for i := Nodo.ChildNodes.Count - 1 downto 0 do
     begin
        if EstaVacio(Nodo.ChildNodes[i]) then
           Nodo.Remove(i)
        else
          EliminarNodosVacios(Nodo.ChildNodes[i]);
     end;
  end;
end;

seccion_31 17-10-2025 16:42:00

Muchas gracias

Al final ya conseguí hacerlo y funciona en una unidad que convierte un record en XML para generar archivos facturae.


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

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