C# 中的 XML - 从资源中读取、操作和显示
Posted
技术标签:
【中文标题】C# 中的 XML - 从资源中读取、操作和显示【英文标题】:XML in C# - Read from Resources, Manipulate and Display 【发布时间】:2010-09-07 11:11:01 【问题描述】:我想做以下,但找不到优雅的方式:
-
将 XML 模板读入
System.Xml.XmlDocument
用我的 UI 中的数据填充它
用我写的XSLT
转换它
应用CSS
样式表
将其渲染到WebBrowser
控件
我目前正在从磁盘上的文件中读取它,填充它,然后在填充后将它保存回磁盘。我在模板中引用了XSLT
,在XSLT
中引用了CSS
,然后使用WebBrowser.Navigate([filename])
方法显示XML文件。
显然,当我开始部署这个应用程序时,它会严重损坏,因为磁盘上不存在该文件,并且我将无法引用 @987654332 中的 XSLT
和 CSS
文件@ 文件,因为它们将是资源。我打算将模板作为资源包含在内,但找不到从那里开始的简洁方法。
非常感谢任何帮助
【问题讨论】:
***.com/questions/851813/… 【参考方案1】:快速提问。为什么需要 Xml 模板?如果您事先已经知道架构,那么只需在您的代码中生成完整的 Xml。应该不需要加载模板文件。
【讨论】:
【参考方案2】:感谢 Keith 的链接,出于兴趣,我会看一下,因为 LINQ 在我的学习清单上。不幸的是,我需要为这个应用程序定位 .Net 2.0,所以我认为(如果我错了,请纠正我!)LINQ 是不可能的。
我现在已将 CSS 包含在 XSLT 的标头中,并且我找到了一种使用 System.Xml.Xsl.XslCompiledTransform 对象在内存中转换 XML 的方法。我目前正在使用 WebBrowser.DocumentText 属性将格式化的 XML 传递到 WebBrowser 组件中,这似乎可行。
我不禁认为这不是最好的做事方式,因此任何有更好方式的 cmets 都会受到赞赏。特别是,如果我使用的是 LINQ,我是否需要一个模式来绑定,而且,我是否应该有一个模式句号?我不太擅长 XML,但我喜欢 Vaibhav 直接从模式而不是使用模板生成的想法。我只是不知道从哪里开始,所以任何指针表示赞赏!
【讨论】:
【参考方案3】:查看Linq to XML - 这是编写和读取基于 Xml 的数据的好方法。比 System.Xml.XmlDocument 机制更容易。
鉴于您提供 XSLT 和 CSS,为什么不使用 Xhtml 构建页面并内联 CSS?或者,只需将 XSLT 和 CSS 文件作为内容添加到您的安装程序中。
编译的帮助实际上与您所描述的类似 - 您可以从 CHM 文件中复制一个链接并使用普通浏览器访问它。我想您可以将显示资源嵌入到帮助文件中,具体取决于它们的使用方式。
【讨论】:
【参考方案4】:因为您使用的是 WebBrowser 控件并且不是 WPF,所以您必须依赖磁盘来加载您在第 4 步中提到的 CSS 文件。解决此问题的唯一方法是使用像 Resource Hacker 这样的工具来加载“非托管”资源并使用 res:// 协议 (http://msdn.microsoft.com/en-us/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 命名空间中。这些评论可能没有帮助,但我试过了:)
【讨论】:
以上是关于C# 中的 XML - 从资源中读取、操作和显示的主要内容,如果未能解决你的问题,请参考以下文章
c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中