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

Vla*_*lad 4 xml delphi xslt internet-explorer twebbrowser

在XP上,如果我想在以下位置查看XML,这段代码运行正常TWebBrowser:

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;
Run Code Online (Sandbox Code Playgroud)

方法如下:XMLXSLT(defaultss.xsl)转换,结果是HTML.

在Vista上我得到了一个例外xml.transformNode(xsl);:

样式表不会占用文档元素.样式表可能是空的,或者它可能不是格式良好的XML文档

我试图从文件中直接加载我自己的XSLT副本,如下所示xsl.load('my.xsl'):

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.他们都失败了同样的异常错误.我能做什么?

Rem*_*eau 5

load()文件显示,使用此URL的例子:

res://msxml3.dll/xml/defaultss.xsl
Run Code Online (Sandbox Code Playgroud)

如果您想在应用中嵌入XSLT作为资源,请确保使用res:引用应用中该资源的URL.有关该语法,请参阅MSDN的文档:

协议

句法

res://sFile[/sType]/sID
Run Code Online (Sandbox Code Playgroud)

令牌

sFile
包含资源的模块的百分比编码路径和文件名.

sType
可选.字符串或数字资源类型.这可以是自定义资源,也可以是FindResource函数可识别的预定义资源类型之一.如果指定了数字资源类型,则标识符的编号必须遵循#字符.如果未指定此参数,则默认资源类型为RT_HTML或RT_FILE.

sID
资源的字符串或数字标识符.如果指定了数字标识符,则标识符的实际编号(而不是标识符本身)必须遵循#字符.

我刚刚检查了Windows 7和msxml3.dll确实有一个XML命名的资源DEFAULTSS.XSL,但msxml4.dllmsxml6.dll没有,也没有msxml.dll文件.

正如MSDN所说,res:默认为HTML或未FILE指定资源类型,因此使用 res://msxml3.dll/defaultss.xls将无效,因为XSLT资源类型是XML替代的.因此,您需要使用res://msxml3.dll/xml/defaultss.xls.