Я наконец сделал это следующим образом: сначала конвертируйте IDOMNode в IXMLNode с помощью метода, найденного где-то, а затем установите случайный атрибут для этого, чтобы его можно было искать при обходе документа.По крайней мере, это работает для узлов Element, это то, что мне было нужно.Я не совсем понимаю, как работает первый шаг преобразования, но это так.
function xmlDomNodeToXMLNode( N : IDOMNode ):IXMLNode; overload;
var
intfDocAccess : IXmlDocumentAccess;
doc: TXMLDocument;
begin
if N = NIL then
Result := NIL
else begin
if Supports( N.OwnerDocument, IXmlDocumentAccess, intfDocAccess) then
doc := intfDocAccess.DocumentObject
else
doc := _xpathdoc as TXMLDocument; // _xpathdoc was used before for XPath query
Result := TXmlNode.Create( N, nil, doc );
end;
end;
var
_an,_av : string;
function xmlDOMNodeToXMLNode( D : IXMLDocument; DN : IDOMNode ):IXMLNode; overload;
function GetIt2( N : IXMLNode ):IXMLNode;
var
i : integer;
begin
if N.HasAttribute( _an ) and ( N.GetAttribute( _an ) = _av ) then
Result := N
else begin
for i := 0 to N.ChildNodes.Count-1 do
begin
Result := GetIt2( N.ChildNodes[i] );
if Assigned( Result ) then
Exit;
end;
end;
end;
var
N : IXMLNode;
i : integer;
begin
N := xmlDomNodeToXMLNode( DN );
_an := Format( 'a%d', [ random(1000000) ] );
_av := Format( 'v%d', [ random(1000000) ] );
N.SetAttribute( _an, _av );
Result := GetIt2( D.DocumentElement );
for i := 0 to N.AttributeNodes.Count-1 do
if N.AttributeNodes[i].NodeName = _an then
begin
N.AttributeNodes.Remove( N.AttributeNodes[i] );
break;
end;
end;
....
XMLNode := xmlDOMNodeToXMLNode( Doc, DOMNode );
XMLNode.ParentNode.ChildNodes.Remove( XMLNode );