C++ 如何在MSXML6和C++/德尔菲?
我正在使用MSXML 6.0解析器进行XSL转换,并希望获取C++ 如何在MSXML6和C++/德尔菲?,c++,xml,delphi,xslt,C++,Xml,Delphi,Xslt,我正在使用MSXML 6.0解析器进行XSL转换,并希望获取。从我在网上发现的情况来看,这似乎是 当使用COM接口时,有没有一种方法可以获得消息输出(C++或Delphi示例代码会更好) 更新: 这是我用来进行XSL转换的代码(非常简单): 我怀疑你能用MSXML6.0做到这一点 和您一样,我生成了MSXML2_Tlb.Pas导入文件,并使用代码v进行了测试。和你的差不多。第一个问题是Delphi包装器组件TDomDocument60和TDomDocument60的OnReadyStateCha
。从我在网上发现的情况来看,这似乎是
当使用COM接口时,有没有一种方法可以获得消息输出(C++或Delphi示例代码会更好)
更新:
这是我用来进行XSL转换的代码(非常简单):
我怀疑你能用MSXML6.0做到这一点 和您一样,我生成了MSXML2_Tlb.Pas导入文件,并使用代码v进行了测试。和你的差不多。第一个问题是Delphi包装器组件TDomDocument60和TDomDocument60的
OnReadyStateChange
和OnDataAvailable
事件
永远不会调用TFreeThreadedDomDocument60
因此,我为一个事件接收器编写了一个OleVariant包装器,它在运行时通过ConnectionPointContainer接口连接到DomDocument60,以获得一个IConnectionPoint并调用.advision()。我发现这个事件接收器在XML文档加载时被调用了四次,每次调用的DispID为-609,这是(XMLDOMDocumentEvents的)onreadystatechange的DispID。但是a)传递给我的包装器调用的参数(PDispParams)是空的,b)它的调用不是为ondataavailable
或其他任何东西调用的,特别是ontransformnode
(其DispID我不知道)
因此,在我看来,首先,MSXML2_Tlb中对象的事件工作不正常,其次,没有明显的方法捕获正在转换的XML文档的ontransformnode
事件
Fwiw,链接页面上的VB示例
似乎暗示有一种方法可以从VB获取
XsltMessageEncounteredEventArgs
,但我对将网络库导入Delphi项目还不够熟悉,不知道需要导入什么才能访问它。如果有人能告诉我,我很乐意试一试。首先,XSLT1.0、XslTransform
和xslcomiledtransform
的.NET实现是纯托管实现,与各种MSXML版本没有任何关系。对于一个MSXML 6和C++的例子,我没有一个,但是也许微软的代码> MSXSL< /COD>命令行工具的源代码有代码,所以我会尝试去看看。请把你的Q添加到确切的德尔菲法(如果有的话)。您正在使用来执行转换?@MartinHonnen:我测试了msxsl.exe
命令行工具,但显然它不处理
命令:当我将它们添加到XSL时,屏幕上不会打印任何内容。使用terminate=“yes”
时,命令终止,错误字符串包含我的消息。我也快速查看了资料来源,但找不到相关信息。好的,谢谢你深入了解。我不打算将整个项目从本机代码转换为托管代码(.NET),这将是使用XsltMessageEncounteredEventArgs
类的要求。谢谢。事实上,我已经取得了一些进展,但还没有解决方案。我在这里偶然发现了一个“重要”的提示:我尝试过使用MSXML3而不是MSXML6。至少在v.3中,ontransformnode事件会触发,但我还没有从传递给该事件的参数中获得任何有用的信息。如果我有进一步的进展,我会更新我的答案。
uses ActiveX, {...} MSXML2_TLB;
function TransformMsXmlDocument( XmlDoc, XslDoc: iXmlDomDocument2 ) : UnicodeString;
var
XslDoc2 : iXmlDomDocument;
XslTemplate : iXslTemplate;
XslProcessor : iXslProcessor;
begin
XslDoc2 := CoFreeThreadedDomDocument60.Create();
XslDoc2.Async := FALSE;
XslDoc2.Load(XslDoc);
XslTemplate := CoXslTemplate60.Create();
XslTemplate.Stylesheet := XslDoc2;
XslProcessor := XslTemplate.CreateProcessor();
XslProcessor.Input := XmlDoc;
XslProcessor.Transform();
result := XslProcessor.Output;
end;