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

时间:2008-09-01 13:23:18

标签: c# xml

我想做以下事情并找不到优雅的方式:

  1. 将XML模板读入System.Xml.XmlDocument
  2. 使用我的用户界面中的数据填充
  3. 使用我编写的XSLT转换它
  4. 应用CSS样式表
  5. 将其渲染为WebBrowser控件
  6. 我正在从磁盘上的文件中读取它,填充它,然后在填充后将其保存回磁盘。我引用了模板中的XSLTCSS中的XSLT,然后使用WebBrowser.Navigate([filename])方法显示XML文件。

    显然,当我开始部署这个应用程序时,由于该文件不会存在于磁盘上,它会突然崩溃,我将无法引用XSLTCSS个文件在XML文件中,因为它们将是资源。我打算将模板作为资源包含在内,但无法从中找到一种巧妙的方法。

    任何帮助非常感谢

4 个答案:

答案 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命名空间中。这些评论可能没什么用,但我尝试过:)