在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。
在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。它们都会在相同的异常错误中失败。我能做什么?
发布于 2014-11-14 18:54:54
文档显示了一个使用此URL的示例:
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.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代替。
https://stackoverflow.com/questions/26919603
复制相似问题