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 中的 XSLTCSS 文件@ 文件,因为它们将是资源。我打算将模板作为资源包含在内,但找不到从那里开始的简洁方法。

非常感谢任何帮助

【问题讨论】:

***.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中

c# 将xml中的数据读取到dataGridView中显示的问题

从 C# 中的大 xml 读取子节点值

需要帮助从 C# 中的 Web 服务读取 xml 响应

C#读取和写入XML文件

c#中xml文件