首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用TWebBrowser在Vista上查看类似IE的XML

使用TWebBrowser在Vista上查看类似IE的XML
EN

Stack Overflow用户
提问于 2014-11-13 22:23:45
回答 1查看 1.3K关注 0票数 4

在XP上,如果我想在TWebBrowser中查看XML,这段代码工作得很好。

代码语言:javascript
运行
复制
uses ComObj, MSHTML, ActiveX;

procedure DocumentFromString(ABrowser: TWebBrowser; const HTMLString: wideString);
var
  v: OleVariant;
  HTMLDocument: IHTMLDocument2;
begin
  if not Assigned(ABrowser.Document) then
  begin
    ABrowser.Navigate('about:blank');
    while ABrowser.ReadyState <> READYSTATE_COMPLETE do
    begin
      Application.ProcessMessages;
      Sleep(0);
    end;
  end;
  HTMLDocument := ABrowser.Document as IHTMLDocument2;
  v := VarArrayCreate([0, 0], varVariant);
  v[0] := HTMLString;
  HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
  HTMLDocument.Close;
end;

procedure WebBrowserXML(ABrowser: TWebBrowser; const XmlString: WideString);
var
  xml, xsl: OleVariant;
  HTMLString: WideString;
begin
  xml := CreateOleObject('Msxml2.DOMDocument');
  xml.async := False;
  xml.loadXML(XmlString);
  // Assert(xml.parseError.errorCode = 0);
  xsl := CreateOleObject('Msxml2.DOMDocument');
  xsl.validateOnParse := False;
  xsl.async := False;
  xsl.load('res://msxml.dll/defaultss.xsl');
  // Assert(xsl.parseError.errorCode = 0);
  HTMLString := xml.transformNode(xsl);
  ABrowser.HandleNeeded;
  DocumentFromString(ABrowser, HTMLString);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowserXML(WebBrowser1, '<xml><node>Hello</node></xml>');
end;

方法如下:将XML转换为XSLT (defaultss.xsl),其结果是HTML

在Vista上,我得到了一个xml.transformNode(xsl);行的出丑

样式表不包含文档元素。样式表可能为空,也可能不是格式良好的XML文档。

我尝试从类似于以下xsl.load('my.xsl')的文件中直接加载我自己的XSLT副本:

http://forums.asp.net/t/1141304.aspx?xslt+viewing+XML+like+that+of+IE

但是,我仍然会得到XSLT无效的相同错误。

如何使这些代码在Vista上工作?

从对链接的评论中,我提供了:

我还发现,在直接调用res://msxml#.dll/defaultss.xsl多年之后,这种方法不再适用于Vista。我已经处理了各种各样的安全设置,但这似乎不是问题所在。看来我唯一的选择就是发布我自己的defaultss.xsl副本。

我似乎无法提供有效的“我自己的副本”的defaultss.xsl。它们都会在相同的异常错误中失败。我能做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-14 18:54:54

文档显示了一个使用此URL的示例:

代码语言:javascript
运行
复制
res://msxml3.dll/xml/defaultss.xsl

如果您想将XSLT作为资源嵌入到应用程序中,只需确保使用引用应用程序中该资源的res: URL。有关这个语法,请参阅MSDN的文档:

res协议

语法 res://sFile/sType/sID 令牌 sFile 包含资源的模块的百分比编码路径和文件名。 sType 可选。字符串或数字资源类型。这可以是自定义资源,也可以是由FindResource函数识别的预定义资源类型之一。如果指定了数字资源类型,则标识符的数目必须跟随一个#字符。如果未指定此参数,则默认资源类型为RT_HTML或RT_FILE.。 sID 资源的字符串或数字标识符。如果指定了数字标识符,则标识符的实际编号(而不是标识符本身)必须遵循#字符。

我刚刚检查了Windows7,msxml3.dll确实有一个名为DEFAULTSS.XSLXML资源,但是msxml4.dllmsxml6.dll没有,也没有msxml.dll文件。

正如MSDN所述,如果没有指定资源类型,res:默认为HTMLFILE,因此使用res://msxml3.dll/defaultss.xls将无法工作,因为XSLT资源类型为XML。因此,您需要使用res://msxml3.dll/xml/defaultss.xls代替。

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

https://stackoverflow.com/questions/26919603

复制
相关文章

相似问题

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