Can I convert a msxml.IXMLDOMNode to XmlIntf.IXMLNode in Delphi?
You can create an instance of IXMLDocument
and "attach" it to your IXMLDOMDocument
. Here's a small example:
program msxmltest;{$APPTYPE CONSOLE}uses SysUtils, ActiveX, msxml, msxmldom, xmldom, XMLIntf, XMLDoc;function MSDOMDocumentToDOMDocument(const MSDOMDocument: IXMLDOMDocument): IDOMDocument;begin Result := TMSDOMDocument.Create(MSDOMDocument) as IDOMDocument;end;function MSDOMNodeToDOMNode(const MSDOMNode: IXMLDOMNode): IDOMNode;const NodeClasses: array[ELEMENT_NODE..NOTATION_NODE] of TMSDOMNodeClass = (TMSDOMElement, TMSDOMAttr, TMSDOMText, TMSDOMCDataSection, TMSDOMEntityReference, TMSDOMEntity, TMSDOMProcessingInstruction, TMSDOMComment, TMSDOMDocument, TMSDOMDocumentType, TMSDOMDocumentFragment, TMSDOMNotation);begin Result := NodeClasses[MSDOMNode.nodeType].Create(MSDOMNode) as IDOMNode;end;function MSDOMNodeToXMLNode(const MSDOMNode: IXMLDOMNode; var OwnerDocument: IXMLDocument): IXMLNode;begin Result := nil; if not Assigned(MSDOMNode) then Exit; if not Assigned(OwnerDocument) then begin OwnerDocument := TXMLDocument.Create(nil); OwnerDocument.DOMDocument := MSDOMDocumentToDOMDocument(MSDOMNode.ownerDocument); end; Result := TXMLNode.Create(MSDOMNodeToDOMNode(MSDOMNode), nil, (OwnerDocument as IXMLDocumentAccess).DocumentObject);end;var Indent: Integer = 0;procedure ShowNode(const Node: IXMLNode);var I: Integer;begin Inc(Indent); Writeln; Writeln(StringOfChar(' ', Indent * 2) + 'NodeName: ' + Node.NodeName); Writeln(StringOfChar(' ', Indent * 2) + 'NodeType: ' + NodeTypeNames[Node.NodeType]); for I := 0 to Node.AttributeNodes.Count - 1 do ShowNode(Node.AttributeNodes[I]); if Node.HasChildNodes then for I := 0 to Node.ChildNodes.Count - 1 do ShowNode(Node.ChildNodes[I]) else Writeln(StringOfChar(' ', Indent * 2) + 'NodeValue: ' + Node.NodeValue); Dec(Indent);end;procedure Main;var MSDOMDocument: IXMLDOMDocument; XMLDocument: IXMLDocument; MSDOMNode: IXMLDOMNode;begin MSDOMDocument := CoDOMDocument.Create; MSDOMDocument.load('C:\Program Files\Embarcadero\RAD Studio\8.0\ObjRepos\en\Code_Templates\Delphi\blockcomment.xml'); MSDOMNode := MSDOMDocument.documentElement; // show all ShowNode(MSDOMNodeToXMLNode(MSDOMNode, XMLDocument)); // you can reuse XMLDocument Writeln; // show author MSDOMNode := MSDOMDocument.selectSingleNode('/codetemplate/template/author'); ShowNode(MSDOMNodeToXMLNode(MSDOMNode, XMLDocument)); Readln;end;begin ReportMemoryLeaksOnShutdown := True; try CoInitialize(nil); try Main; finally CoUninitialize; end; except on E: Exception do begin ExitCode := 1; Writeln(Format('[%s] %s', [E.ClassName, E.Message])); end; end;end.