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

使用TWebBrowser在Vista上查看类似IE的XML,xml,delphi,internet-explorer,xslt,twebbrowser,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)

在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;
使用ComObj、MSHTML、ActiveX;
过程文档fromstring(ABrowser:TWebBrowser;const-HTMLString:wideString);
变量
v:油变异体;
HTMLDocument:IHTMLDocument2;
开始
如果未分配(ABrowser.Document),则
开始
ABrowser.Navigate('about:blank');
当ABrowser.ReadyState ReadyState_完成时
开始
Application.ProcessMessages;
睡眠(0);
结束;
结束;
HTMLDocument:=作为IHTMLDDocument2的ABrowser.文档;
v:=VarArrayCreate([0,0],varvarvariant);
v[0]:=HTMLString;
HTMLDocument.Write(PSafeArray(TVarData(v.VArray));
HTMLDocument.Close;
结束;
过程WebBrowserXML(ABrowser:TWebBrowser;constxmlstring:WideString);
变量
xml,xsl:OleVariant;
HTMLString:宽字符串;
开始
xml:=CreateOleObject('Msxml2.DOMDocument');
xml.async:=False;
loadXML(XmlString);
//断言(xml.parseError.errorCode=0);
xsl:=CreateOleObject('Msxml2.DOMDocument');
xsl.validateOnParse:=False;
xsl.async:=False;
load('res://msxml.dll/defaultss.xsl');
//断言(xsl.parseError.errorCode=0);
HTMLString:=xml.transformNode(xsl);
小叶草;
DocumentFromString(ABrowser,HTMLString);
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
WebBrowserXML(WebBrowser1,'Hello');
结束;
方法如下:使用XSLT
defaultss.xsl
)转换XML,结果是HTML

在Vista上,我在
xml.transformNode(xsl)行中得到一个exeption

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

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

但我仍然得到了XSLT无效的相同错误

如何使此代码在Vista上工作


根据我提供的对报告的评论:

我还发现,直接打电话到 res://msxml#.dll/defaultss.xsl多年来,这种方法不再有效 在维斯塔。我弄乱了各种安全设置,但是 这似乎不是问题所在。看来我唯一的选择就是 发布我自己的defaultss.xsl副本

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

显示了使用此URL的示例:

res://msxml3.dll/xml/defaultss.xsl
如果您想在应用程序中嵌入XSLT作为资源,只需确保使用引用应用程序中该资源的
res:
URL即可。有关该语法,请参阅MSDN文档:

语法

res://sFile[/sType]/sID
代币

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

sType
可选。字符串或数字资源类型。这可以是自定义资源,也可以是FindResource函数识别的预定义资源类型之一。如果指定了数字资源类型,则标识符的编号必须跟在#字符后面如果未指定此参数,则默认资源类型为RT\U HTML或RT\U文件。

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


我刚在Windows7上检查过,
msxml3.dll
确实有一个名为
DEFAULTSS.XSL
XML
资源,但是
msxml4.dll
msxml6.dll
没有,并且没有
msxml.dll
文件


正如MSDN所说,
res:
默认为
HTML
FILE
,如果未指定资源类型,则使用
res://msxml3.dll/defaultss.xls
将不起作用,因为XSLT资源类型改为
XML
。因此,您需要使用
res://msxml3.dll/xml/defaultss.xls
取而代之。

在调用
transformNode()
之前,是否验证了
load()
是否确实成功?您是否验证
res:
URL是否有效?当我试图将该URL加载到IE11中时,它无法访问它。@RemyLebeau,是的,我验证了所有内容
xsl.load()
失败。这正是问题所在:没有有效的
res://msxml.dll/defaultss.xsl
。我不介意使用我自己的xslt,只要它是有效的xslt,我就可以将它嵌入到我的exe res中,但我无法使它工作。如果你想将xslt作为资源嵌入到你的应用程序中,只需确保使用引用你的应用程序的
res:
URL即可。有关该语法,请参阅。我刚刚在Windows 7上检查过,
msxml3.dll
确实有一个名为
DEFAULTSS.XSL
XML
资源,但是
msxml4.dll
msxml6.dll
没有,并且没有
msxml.dll
文件。正如MSDN所说,
res:
默认为
/html/
/file/
,如果不指定资源类型。因此
res:msxml3.dll/defaultss.xls
不应该工作,因为资源是
XML
,因此使用
res:msxml2.dll/XML/defaults.xls
res://msxml3.dll/defaultss.xls
不应该工作,因为资源类型是
XML
,因此使用
res://msxml3.dll/xml/defaults.xls