И в чем проблема?
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
sXml = '<xml><items><item><id>1</id></item><item><id>2</id></item></items></xml>';
var
xmlDoc : IXMLDocument;
strXml : String;
begin
xmlDoc := TXMLDocument.Create(Nil);
Try
xmlDoc.LoadFromXML(sXml);
xmlDoc.Active := True;
xmlDoc.ChildNodes.Nodes[0].AddChild('item').AddChild('id').Text := '3';
xmlDoc.SaveToXML(strXml);
strXml := StringReplace(strXml,'</item>','</item>'#13#10,[rfReplaceAll]); // Это просто для удобства просмотра
ShowMessage(strXml);
Finally
End;
end;
т.е. у тебя в xmlDoc уже ссылка на интерфейс сразу после создания объекта.
Если тебе нужен именно IUnknown, то попроси его у IXMLDocument:
Код:
var
intfUnkn : IUnknown;
begin
...
intfUnkn := xmlDoc as IUnknown;
...
ЗЫ. Кстати, такой объект удалять не надо, он сам самоудалится как только выйдет из области видимости - это ж Com объект.
ЗЗЫ. Кстати, IXMLDocument, походу, не является OLE Automation интерфейсом, так что "засунуть" его в OleVariant не получится.
Если надо возвращать какой-то общий тип, то возвращай IUnknown:
Код:
function GetXML(Str : String) : IUnknown;
var
xmlDoc : IXMLDocument;
begin
xmlDoc := TXMLDocument.Create(Nil);
xmlDoc.LoadFromXML(str);
xmlDoc.Active := True;
Result := xmlDoc as IUnknown;
end;
procedure TForm1.Button2Click(Sender: TObject);
const
sXml = '<xml><items><item><id>1</id></item><item><id>2</id></item></items></xml>';
var
xmlDoc : IXMLDocument;
strXml : String;
begin
xmlDoc := GetXML(sXml) as IXMLDocument;
xmlDoc.ChildNodes.Nodes[0].AddChild('item').AddChild('id').Text := '3';
xmlDoc.SaveToXML(strXml);
strXml := StringReplace(strXml,'</item>','</item>'#13#10,[rfReplaceAll]); // Это просто для удобства просмотра
ShowMessage(strXml);
end;