在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
。他们都失败了同样的异常错误。我该怎么办?
答案 0 :(得分:5)
load()
documentation显示了使用此网址的示例:
res://msxml3.dll/xml/defaultss.xsl
如果您想在应用中嵌入XSLT作为资源,请确保使用引用应用中该资源的res:
网址。有关该语法,请参阅MSDN的文档:
语法
res://sFile[/sType]/sID
代币
sFile
包含资源的模块的百分比编码路径和文件名。STYPE
可选的。字符串或数字资源类型。这可以是自定义资源,也可以是FindResource函数可识别的预定义资源类型之一。如果指定了数字资源类型,则标识符的编号必须遵循#字符。 如果未指定此参数,则默认资源类型为RT_HTML或RT_FILE。SID
资源的字符串或数字标识符。如果指定了数字标识符,则标识符的实际编号,而不是标识符本身,必须遵循#字符。
我刚刚在Windows 7上查看过,msxml3.dll
确实有一个名为XML
的{{1}}资源,但DEFAULTSS.XSL
和msxml4.dll
没有,并且没有msxml6.dll
档案。
正如MSDN所说,如果未指定资源类型,msxml.dll
默认为res:
或HTML
,因此使用FILE
将无效,因为XSLT资源类型为{ {1}}而是。因此,您需要使用res://msxml3.dll/defaultss.xls
代替。