使用TWebBrowser在Vista上查看类似IE的XML
在XP上,如果我想在使用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)
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
。