Delphi IXMLDocument удалить узел результата XPath - PullRequest
0 голосов
/ 22 мая 2018

Я ищу некоторые узлы с помощью xpath и хочу удалить их из документа.Есть ли способ сделать это?Проблема в том, что xpath в delphi приводит к IDOMNode, а не к IXMLNode.Могу ли я вернуть «оригинальный» IXMLNode?Код в основном такой - поиск в IXMLNode N с использованием Expr для xpath.

var
  XPathDOMNodeList: IDOMNodeList;
  DN : IDomNode;

begin  
  if Assigned(N) and
     Supports(N.DOMNode, IDOMNodeSelect, DOMNodeSelect) then
  begin
    XPathDOMNodeList := DOMNodeSelect.selectNodes( Expr );
    if Assigned( XPathDOMNodeList ) and ( XPathDOMNodeList.length > 0 ) then
    begin
      DN := _XPathDOMNodeList.item[ 0 ];

      // now how to remove original IXMLNode matching DN ???    

    end;
  end;
...

1 Ответ

0 голосов
/ 23 мая 2018

Я наконец сделал это следующим образом: сначала конвертируйте 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...