5

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

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

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

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

非常感谢任何帮助

4

4 回答 4

1

感谢 Keith 的链接,出于兴趣,我会看一下,因为 LINQ 在我的学习清单上。不幸的是,我需要为这个应用程序定位 .Net 2.0,所以我认为(如果我错了,请纠正我!)LINQ 是不可能的。

现在,我已经将 CSS 包含在 XSLT 的标头中,并且找到了一种使用 System.Xml.Xsl.XslCompiledTransform 对象在内存中转换 XML 的方法。我目前正在使用 WebBrowser.DocumentText 属性将格式化的 XML 传递到 WebBrowser 组件中,这似乎有效。

我不禁认为这不是最好的做事方式,所以任何关于更好方式的评论都将不胜感激。特别是,如果我使用的是 LINQ,我是否需要一个模式来绑定,而且,我是否应该有一个模式句号?我对 XML 不是很好,但我喜欢 Vaibhav 直接从模式而不是使用模板生成的想法。我只是不确定从哪里开始,所以任何指针表示赞赏!

于 2008-09-01T16:30:31.283 回答
1

快速提问。为什么需要 Xml 模板?如果您事先已经知道架构,那么只需在您的代码中生成完整的 Xml。不需要加载模板文件。

于 2008-09-01T13:29:09.860 回答
0

查看Linq to XML - 这是编写和读取基于 Xml 的数据的好方法。比 System.Xml.XmlDocument 机制更容易。

既然您提供了 XSLT 和 CSS,为什么不用 XHTML 构建页面并内联 CSS?或者,只需将 XSLT 和 CSS 文件作为内容添加到您的安装程序中。

编译的帮助实际上与您所描述的类似 - 您可以从 CHM 文件中复制链接并使用普通浏览器访问它。我想您可以将显示资源嵌入帮助文件中,具体取决于它们的使用方式。

于 2008-09-01T15:00:44.290 回答
0

因为您使用的是 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 命名空间中。这些评论可能没有帮助,但我试过了:)

于 2008-10-03T00:31:38.347 回答