C#中的XML-从资源中读取,操作和显示

时间:2020-03-05 18:45:59  来源:igfitidea点击:

我想执行以下操作,但找不到一种优雅的方法:

  • 将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命名空间中。这些评论可能没有帮助,但我尝试过:)