OK, fatto. Solo che adesso ho un dubbio atroce. Premetto che il file xml sarà formato così:
codice:
<?xml version="1.0" encoding="iso-8859-1"?>
<service>
	<phones>
		<phone interno="101">
			<username>Fabrizio</username>
			<status>1</status>
		</phone>
	</phones>
</service>
Il client in pratica funziona così: legge una variazione di stato del telefono (ad esempio se riceve una chiamata, se sta per inviare una chiamata e così via) ed invia un record (che contiene interno, username e status) al server che esegue questo codice:
codice:
 xmlDoc.FileName := path+'status.xml';
 try
  xmlDoc.Active := true;
  ANode := xmlDoc.DocumentElement;
  ANode := ANode.ChildNodes.FindNode('phones');
  if (ANode <> nil) and (ANode.ChildNodes.Count > 0) then
   begin
    fh := 0;
    found:= false;
    repeat
     begin
      if ANode.ChildNodes[fh].Attributes['interno'] = l.number then
       begin
        found := true;
        ANode.ChildNodes[fh].ChildNodes.FindNode('status').NodeValue :=l.status;
       end
      else
       fh := fh+1;
     end;
    until (fh<=ANode.ChildNodes.Count) or (found=true);
    if (found=false) then
     begin
      ANode := xmlDoc.DocumentElement;
      ANode := Anode.ChildNodes.FindNode('phones');
      ANode := ANode.AddChild('phone');
      ANode.Attributes['interno'] := l.number;
      ANode.AddChild('username').NodeValue := l.user;
      ANode.AddChild('status').NodeValue := l.status;
     end;
   end
  else
   begin
    ANode := xmlDoc.DocumentElement;
    ANode := ANode.ChildNodes.FindNode('phones');
    ANode := ANode.AddChild('phone');
    ANode.Attributes['interno'] := l.number;
    ANode.AddChild('username').NodeValue := l.user;
    ANode.AddChild('status').NodeValue := l.status;
   end;
 except on e:exception do
  WriteLog('Errore xml: '+E.Message);
 end;
 xmlDoc.SaveToFile(path+'status.xml');
 xmlDoc.Active := false;
In pratica, dopo aver caricato il contenuto del file "status.xml" esegue un clico per cercare se nel file è registrato il telefono con interno l.interno
Se lo trova modifica il campo status, altrimenti aggiunge un altro nodo con interno=l.interno
e tutte le informazioni contenute nel record.

Il problema è che con un unico client non ha problemi (aggiorna correttamente il nodo relativo all'interno associato al client). Già con due client (associati, ovviamente, a due interni differenti) lo status di un client viene aggiornato mentre quello del secondo viene aggiunto anche se già presente.
Premettendo che il server è in realtà un servizio windows (quindi già di per sè multithread), il problema potrebbe essere un accesso simultaneo dei due client al file xml? E se sì, come potrei fare a risolverlo?