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

时间:2014-11-13 22:23:45

标签: xml delphi internet-explorer xslt twebbrowser

在XP上,如果我想在TWebBrowser中查看XML,那么这段代码就可以了。

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 。< / p>

在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上运行?


从评论到我提供的link

  

我也发现在直接打电话之后    res://msxml#.dll/defaultss.xsl 多年来,此方法不再有效   在Vista中。我已经搞砸了各种各样的安全设置,但那   似乎不是问题。看起来我唯一的选择就是   发布我自己的defaultss.xsl副本。

我似乎无法提供有效的&#34;我自己的副本&#34; defaultss.xsl。他们都失败了同样的异常错误。我该怎么办?

1 个答案:

答案 0 :(得分:5)

load() documentation显示了使用此网址的示例:

res://msxml3.dll/xml/defaultss.xsl

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

res Protocol

  

语法

res://sFile[/sType]/sID
     

代币

     

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

     

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

     

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

我刚刚在Windows 7上查看过,msxml3.dll确实有一个名为XML的{​​{1}}资源,但DEFAULTSS.XSLmsxml4.dll没有,并且没有msxml6.dll档案。

正如MSDN所说,如果未指定资源类型,msxml.dll默认为res:HTML,因此使用FILE将无效,因为XSLT资源类型为{ {1}}而是。因此,您需要使用res://msxml3.dll/defaultss.xls代替。