Ver Mensaje Individual
  #2  
Antiguo 09-07-2025
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Reputación: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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;
Responder Con Cita