【问题标题】:XML in C# - Read from Resources, Manipulate and DisplayC# 中的 XML - 从资源中读取、操作和显示
【发布时间】:2010-09-07 11:11:01
【问题描述】:

我想做以下,但找不到优雅的方式:

  1. 将 XML 模板读入 System.Xml.XmlDocument
  2. 用我的 UI 中的数据填充它
  3. 用我写的XSLT转换它
  4. 应用CSS 样式表
  5. 将其渲染到WebBrowser 控件

我目前正在从磁盘上的文件中读取它,填充它,然后在填充后将它保存回磁盘。我在模板中引用了XSLT,在XSLT中引用了CSS,然后使用WebBrowser.Navigate([filename])方法显示XML文件。

显然,当我开始部署这个应用程序时,它会严重损坏,因为磁盘上不存在该文件,并且我将无法引用 @987654332 中的 XSLTCSS 文件@ 文件,因为它们将是资源。我打算将模板作为资源包含在内,但找不到从那里开始的简洁方法。

非常感谢任何帮助

【问题讨论】:

标签: c# xml


【解决方案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 命名空间中。这些评论可能没有帮助,但我试过了:)

        【讨论】:

          猜你喜欢
          • 2011-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-21
          • 2012-09-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多