我正在使用。net Core创建WPF应用程序,并需要显示撰写的XML内容。我们使用其他软件将xml转换为html用于在线托管。但是,在编写过程中,我需要能够看到使用xsl文件转换的本地XML内容的预览。我正在使用Linq to XML。
我首先在TabItem
中创建WebView2
控件。使用预发布版本1.0.790,我试图利用SetVirtualHostNameToFolderMapping
没有成功。我刚开始只是尝试使用示例代码的复制粘贴打开一个通用的html文件,但只得到一个消息说appasssets。示例的IP无法解决。我仔细检查了文件夹的位置,以及文件夹里的文件。
我的下一个尝试是利用NavigateToString
并发送xml。这里有几个问题。第一个是任何XProcessingInstruction
get都转换为评论,我想这是一个安全功能?否则,我看到的只是内部xml内容。xml从
<?xml-stylesheet type="text/xsl" href="Template-xsl.xsl"?>
插入注释:
<!--?xml-stylesheet type="text/xsl" href="Template-xsl.xsl"?-->
另一个无关的问题是,如果我添加一个InternalSubset
的webview不承认关闭]>
我不确定这是否是一个webview问题,所以我在notepad++中检查了它,它看起来是同样的问题。我试过删除空格和换行符,但没有任何改变。第一个实体似乎显示ok,但下一行总是不同的颜色,这使我相信它以某种方式读取第一个实体的结束作为结束DocType。DocType的XML是:
<!DOCTYPE dmodule [
<!ENTITY svg-test SYSTEM "svg-test.svg" NDATA svg >
<!ENTITY svg-test1 SYSTEM "svg-test1.svg" NDATA svg >
]>
我开始只是创建一个字符串和更新InternalSubset
。然后我试着创建一个新的文档类型,并插入与上面相同的结果。
string ent = Environment.NewLine;
foreach (SVG s in sVGs)
ent += $" <!ENTITY {s.GraphicInfoEntityIdent} SYSTEM u0022{s.FileName}u0022 NDATA svg >"
+ Environment.NewLine;
XDocumentType doctype = new XDocumentType("dmodule", null, null, ent);
xDoc.AddFirst(doctype);
我错过了什么,这是最好的方法吗?
编辑1:我认为浏览器会处理转换,但显然不是这样。根据Martin的建议,我回过头来创建了一个新方法,在将xml传递给Webview之前对其进行转换。这似乎可以工作,但我一直得到一个xslt编译错误。它没有给我任何指示,所以我开始删除xslt脚本并找到了罪魁祸首。我需要弄清楚如何让编译工作,因为转换将不完全工作没有它,但这是另一个问题。浏览器将显示转换后的xml内容。
如果我在跟踪,你想
- 查找本地XML文件和本地XSL文件
- 用XSL将XML转换为HTML并显示HTML结果
我从来没有运气的浏览器转换,所以我有一个不同的解决方案给你。在XPF程序中运行转换,并将HTML结果传递给浏览器。
- 使用WPF程序加载XML、XSL并将其转换为HTML。由于WPF程序是"本地的",它将对本地文件具有完全的可见性。 在WebView2控件中加载一个特殊的网页。将HTML发布到WebView2窗口。下面的示例,注释脚本,捕获来自XPF程序的消息。
- 在WPF程序中,将步骤1中的HTML发布到特殊的网页。最后,. js捕获消息(HTML),并用它更新页面。
这是一个特殊的网页,它监听来自XPF程序的HTML。
<html>
<head>
</head>
<body>
<div id='xformhtml'/>
</body>
<script type='text/javascript'>
let xformDiv = document.querySelector( "#xformhtml );
if( window.chrome.webview ) {
window.chrome.webview.addEventListener( 'message', event => {
xformDiv.innerHTML = event.data;
});
} else {
xformDiv.innerHTML = "<h2>Sorry webview communication not supported.</h2>"
}
</script>
</html>
此链接显示了如何与示例页面通信。
https://github.com/MicrosoftEdge/WebView2Feedback/issues/247