Delphi 11 FMX安卓端XML转XSLT报错,求助切换DOM供应商及解决方法
Delphi 11 FMX 安卓平台XML XSLT转换问题解决
一、切换DOM供应商解决TransformNode不支持问题
安卓平台默认使用的Ommi XML DOM供应商不支持TransformNode方法,你可以切换到ADOM(Delphi自带的跨平台DOM供应商)来实现转换:
代码示例
uses Xml.XmlIntf, Xml.Doc, Xml.AdomXmlDom; procedure TForm2.BtnTransformXML(Sender: TObject); var XML : IXMLDocument; XSL : IXMLDocument; XMLOutput : WideString; TransformNodeIntf: IDOMNodeTransform; begin // 初始化XML文档并指定ADOM供应商 XML := TXMLDocument.Create(nil); XML.DOMVendor := GetDOMVendor('ADOM'); XML.LoadFromXML(ReadTextFile(FXML_File)); // 初始化XSL文档并指定ADOM供应商 XSL := TXMLDocument.Create(nil); XSL.DOMVendor := GetDOMVendor('ADOM'); XSL.LoadFromXML(ReadTextFile(FXSLT_File)); // 检查并调用转换接口 if Supports(XML.DocumentElement, IDOMNodeTransform, TransformNodeIntf) then TransformNodeIntf.TransformNode(XSL.DocumentElement as IDOMNode, XMLOutput) else raise Exception.Create('当前DOM供应商不支持XSLT转换'); Memo1.Text := XMLOutput; end;
注意:确保项目中已引用Xml.AdomXmlDom单元,ADOM是Delphi原生支持的跨平台DOM实现,完全兼容XSLT转换逻辑。
二、使用TXMLTransform组件(更简洁的跨平台方案)
Delphi自带的TXMLTransform组件封装了跨平台的XSLT转换逻辑,无需手动切换DOM供应商,更适合FMX跨平台开发:
代码示例
uses Xml.XmlIntf, Xml.Doc, Xml.Transform, System.Classes; procedure TForm2.BtnTransformXML(Sender: TObject); var XMLDoc, XSLDoc: TXMLDocument; OutputStream: TStringStream; begin XMLDoc := TXMLDocument.Create(nil); try XMLDoc.LoadFromFile(FXML_File); XMLDoc.Options := XMLDoc.Options + [doNodeAutoIndent]; XSLDoc := TXMLDocument.Create(nil); try XSLDoc.LoadFromFile(FXSLT_File); // 配置XMLTransform组件 XMLTransform1.XMLSource := XMLDoc; XMLTransform1.XSLSource := XSLDoc; // 转换到字符串流并输出到Memo OutputStream := TStringStream.Create('', TEncoding.UTF8); try XMLTransform1.TransformToStream(OutputStream); OutputStream.Position := 0; Memo1.Text := OutputStream.ReadString(OutputStream.Size); finally OutputStream.Free; end; finally XSLDoc.Free; end; finally XMLDoc.Free; end; end;
使用步骤
- 在FMX窗体的「XML」组件面板中添加
TXMLTransform组件; - 直接使用上述代码加载XML和XSL文件并执行转换即可。
内容的提问来源于stack exchange,提问作者Pedro Luque
相关产品推荐
相关产品推荐

