Delphi中如何通过XPath获取的IDOMNode删除原IXMLNode?
如何将XPath获取的IDOMNode还原为Delphi的原始IXMLNode
嘿,我太懂你遇到的这个麻烦了——用XPath查询拿到IDOMNode后,没法直接用熟悉的IXMLNode方法去删除节点,确实有点卡壳。不过别担心,Delphi的XML框架其实藏着一个简单的转换方式。
核心解决方法:用GetXMLNode函数完成映射
Delphi在XmlIntf单元里提供了GetXMLNode函数,它能直接把IDOMNode对象映射回对应的原始IXMLNode。你只需要确保已经引用了XmlIntf单元,就能轻松完成转换。
修改后的可运行代码示例
uses XmlIntf; // 务必引用这个单元,否则找不到GetXMLNode var XPathDOMNodeList: IDOMNodeList; DN : IDomNode; TargetNode: IXMLNode; 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]; // 关键步骤:将IDOMNode转换为对应的IXMLNode TargetNode := GetXMLNode(DN); if Assigned(TargetNode) then begin // 现在就能用IXMLNode的方法删除节点了 TargetNode.ParentNode.DeleteChild(TargetNode); // 如果TargetNode是N的直接子节点,也可以直接写N.DeleteChild(TargetNode) end; end; end; // ... end;
额外注意事项
- 不是所有
IDOMNode都有对应的IXMLNode(比如纯文本节点、注释节点这类可能没被封装成IXMLNode),所以转换后一定要检查TargetNode是否不为空。 - 如果需要批量处理查询到的所有节点,直接循环遍历
XPathDOMNodeList,逐个转换后删除即可。
内容的提问来源于stack exchange,提问作者kgz
相关产品推荐
相关产品推荐

