C#中的XML-从资源中读取,操作和显示
我想执行以下操作,但找不到一种优雅的方法:
- 将XML模板读取到
System.Xml.XmlDocument
中 - 用我的UI中的数据填充
- 用我编写的XSLT对其进行转换
- 套用CSS样式表
- 渲染到
WebBrowser
控件
我目前正在从磁盘上的文件读取它,然后将其填充,然后在填充后将其保存回磁盘。我在模板中引用了XSLT,在XSLT中引用了CSS,然后使用WebBrowser.Navigate([filename])方法来显示XML文件。
显然,当我部署此应用程序时,它将崩溃,因为该文件将不存在于磁盘上,并且我将无法在XML文件中引用XSLT和CSS文件作为他们将是资源。我打算将模板作为资源包括在内,但找不到从那里继续进行操作的整洁方法。
任何帮助,不胜感激
解决方案
回答
快速提问。为什么需要Xml模板?如果我们已经事先了解了架构,则只需在代码中生成完整的Xml。不需要加载模板文件。
回答
查看Linq to XML,这是编写和读取基于Xml的数据的好方法。比System.Xml.XmlDocument机制更容易。
既然我们要提供XSLT和CSS,为什么不使用XHTML构建页面并内联CSS?或者,只需将XSLT和CSS文件添加为安装程序中的内容。
编译后的帮助实际上会执行我们所描述的操作,我们可以复制CHM文件中的链接,然后使用常规浏览器访问该链接。我想我们可以根据使用方式将显示资源嵌入帮助文件中。
回答
感谢链接Keith,由于LINQ属于我要学习的东西,因此我将不感兴趣地进行介绍。不幸的是,我需要为此应用程序瞄准.Net 2.0,所以我认为(如果我错了,请纠正我!)LINQ毫无疑问。
现在,我已经将CSS包含在XSLT的标头中,并且找到了一种使用System.Xml.Xsl.XslCompiledTransform对象转换内存中XML的方法。我当前正在使用WebBrowser.DocumentText属性将格式化的XML传递到WebBrowser componenet中,这似乎可行。
我不禁以为这不是做事的最佳方法,因此,对更好方法的任何评论将不胜感激。尤其是,如果我使用的是LINQ,是否需要绑定架构,并且是否需要完整架构?我对XML不太满意,但是我喜欢Vaibhav的想法,即直接从架构而不是模板生成。我不确定从哪里开始,所以不胜感激!
回答
因为我们使用的是WebBrowser控件而不是WPF,所以我们必须依赖磁盘来加载在步骤4中提到的CSS文件。解决此问题的唯一方法是使用Resource Hacker之类的工具加载"非托管"资源并使用res ://协议(http://msdn.microsoft.com/zh-cn/library/aa767740(VS.85).aspx),以了解真正的Microsoft 1990年代的怀旧情调。
我们仍然需要将数据放入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命名空间中。这些评论可能没有帮助,但我尝试过:)