我想做以下事情并找不到优雅的方式:
System.Xml.XmlDocument
XSLT
转换它CSS
样式表WebBrowser
控件我正在从磁盘上的文件中读取它,填充它,然后在填充后将其保存回磁盘。我引用了模板中的XSLT
和CSS
中的XSLT
,然后使用WebBrowser.Navigate([filename])
方法显示XML文件。
显然,当我开始部署这个应用程序时,由于该文件不会存在于磁盘上,它会突然崩溃,我将无法引用XSLT
和CSS
个文件在XML
文件中,因为它们将是资源。我打算将模板作为资源包含在内,但无法从中找到一种巧妙的方法。
任何帮助非常感谢
答案 0 :(得分:1)
快速提问。为什么需要Xml模板?如果您已经预先了解了架构,那么只需在代码中生成完整的Xml。不需要加载模板文件。
答案 1 :(得分:1)
感谢Keith的链接,我会看一下感兴趣,因为LINQ是我要学习的东西。不幸的是,我需要针对这个应用程序定位.Net 2.0,所以我认为(请纠正我,如果我错了!)LINQ是不可能的。
我现在已经将CSS包含在XSLT的头文件中,并且我找到了一种方法来使用System.Xml.Xsl.XslCompiledTransform对象来转换内存中的XML。我目前正在使用WebBrowser.DocumentText属性将格式化的XML传递到WebBrowser组件中,这似乎有效。
我不禁想到这不是最好的做事方式,因此任何有关更好方法的评论都会受到赞赏。特别是,如果我使用LINQ,我是否需要一个模式来绑定,而且,我应该有一个模式完全停止吗?我对XML并不擅长,但我喜欢Vaibhav直接从模式生成而不是使用模板的想法。我只是不确定从哪里开始,所以任何指针都赞赏!
答案 2 :(得分:0)
查看Linq to XML - 这是编写和读取基于Xml的数据的好方法。比System.Xml.XmlDocument机制更容易。
鉴于您正在提供XSLT和CSS,为什么不在XHTML中构建页面并内联CSS?或者,只需将XSLT和CSS文件作为内容添加到安装程序中。
编译的帮助实际上会像您所描述的那样 - 您可以从CHM文件复制链接并使用普通浏览器访问它。我想您可以将显示资源嵌入到帮助文件中,具体取决于它们的使用方式。
答案 3 :(得分:0)
因为您使用的是WebBrowser控件而不是 WPF,所以必须依赖于磁盘来加载您在步骤4中提到的CSS文件。唯一的方法是使用像Resource Hacker这样的工具加载“非托管”资源,并使用 res:// 协议(http://msdn.microsoft.com/en-us/library/aa767740(VS.85).aspx)来实现一些真正的微软90年代的怀旧情绪。
您仍需要将数据转换为HTML元素。下面的代码示例可能有助于回答:
void WireUpBrowserEvents()
{
HtmlElement table = this._browser.Document.GetElementById( "UnitFormsTable" );
if ( table != null )
{
HtmlElementCollection thead = table.GetElementsByTagName( "thead" );
if ( ( thead != null ) && ( thead.Count == 1 ) )
{
HtmlElementCollection links = thead[0].GetElementsByTagName( "a" );
if ( ( links != null ) && ( links.Count > 0 ) )
{
foreach ( HtmlElement a in links )
{
a.Click += new HtmlElementEventHandler( XslSort_Click );
}
}
}
}
}
void XslSort_Click( object sender, HtmlElementEventArgs e )
{
e.ReturnValue = false;
if ( this._xslSortWorker.IsBusy ) return;
if ( sender is HtmlElement )
{
HtmlElement a = sender as HtmlElement;
this._browser.Hide();
this._browserMessage.Visible = true;
this._browserMessage.Refresh();
this._xslSortWorker.RunWorkerAsync( a.Id );
}
}
您可能已经知道HtmlElement和HtmlElementCollection位于System.Windows.Forms命名空间中。这些评论可能没什么用,但我尝试过:)