如何使用WebView2显示XML内容使用XSL转换?



我正在使用。net Core创建WPF应用程序,并需要显示撰写的XML内容。我们使用其他软件将xml转换为html用于在线托管。但是,在编写过程中,我需要能够看到使用xsl文件转换的本地XML内容的预览。我正在使用Linq to XML。

我首先在TabItem中创建WebView2控件。使用预发布版本1.0.790,我试图利用SetVirtualHostNameToFolderMapping没有成功。我刚开始只是尝试使用示例代码的复制粘贴打开一个通用的html文件,但只得到一个消息说appasssets。示例的IP无法解决。我仔细检查了文件夹的位置,以及文件夹里的文件。

我的下一个尝试是利用NavigateToString并发送xml。这里有几个问题。第一个是任何XProcessingInstructionget都转换为评论,我想这是一个安全功能?否则,我看到的只是内部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结果传递给浏览器。

  1. 使用WPF程序加载XML、XSL并将其转换为HTML。由于WPF程序是"本地的",它将对本地文件具有完全的可见性。
  2. 在WebView2控件中加载一个特殊的网页。将HTML发布到WebView2窗口。下面的示例,注释脚本,捕获来自XPF程序的消息。
  3. 在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

最新更新