首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MSXML6和C++/Delphi中检索不终止的xsl:消息?

如何在MSXML6和C++/Delphi中检索不终止的xsl:消息?
EN

Stack Overflow用户
提问于 2016-04-04 07:04:07
回答 1查看 317关注 0票数 1

我使用MSXML6.0解析器进行XSL转换,并希望获取<xsl:message terminate="no"> 调试消息。从我在网上发现的情况来看,这似乎是可能在.NET中

在使用COM接口时是否有一种获得消息输出的方法(C++或Delphi示例代码将非常好)?

更新:

这是我用来执行XSL转换的代码(非常直接):

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-04 13:53:33

我怀疑您是否可以用MSXML6.0来完成这个任务。

与您一样,我生成了MSXML2_Tlb.Pas导入文件,并使用与您类似的代码v进行了测试。第一个问题是德尔菲包装器组件的OnReadyStateChangeOnDataAvailable事件TDomDocument60和TFreeThreadedDomDocument60从未被调用过。

然后,我为一个事件接收器编写了一个OleVariant包装器,该接收器在运行时通过其ConnectionPointContainer接口连接到DomDocument60,以获得IConnectionPoint并调用.Advise()。我发现,当XML文档加载时,这个事件接收器会被调用四次,每次调用的DispID为-609,即DispID of onreadystatechange (of XMLDOMDocumentEvents)。但是,传递给我的包装器调用的Params (PDispParams )是空的,b)它的调用没有调用ondataavailable或其他任何东西,特别是ontransformnode (它的DispID我不知道)。

因此,在我看来,首先,MSXML2_Tlb中的对象的事件不能正常工作;其次,没有明显的方法捕捉正在转换的XML的ontransformnode事件。

Fwiw,你链接的页面上的VB例子,

https://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltmessageencounteredeventargs%28v=vs.110%29.aspx

这似乎意味着有一种从VB获取XsltMessageEncounteredEventArgs的方法,但是我还不太熟悉将网络库导入到Delphi项目中,以了解我需要导入什么才能访问它。如果有人能告诉我,我很乐意试一试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36396392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档