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

5
我想做以下操作,但找不到优雅的方法:
  1. 将XML模板读入System.Xml.XmlDocument
  2. 用来自我的UI的数据填充它
  3. 使用我编写的XSLT进行转换
  4. 应用CSS样式表
  5. 将其呈现到WebBrowser控件中
我目前是从磁盘上的文件中读取它,填充它,然后在填充它之后将其保存回磁盘。 我在模板中引用了XSLT,在XSLT中引用了CSS,然后使用WebBrowser.Navigate([filename])方法显示XML文件。
显然,当我部署这个应用程序时,它会因为文件不存在而严重崩溃,并且我将无法在XML文件中引用XSLTCSS文件,因为它们将成为资源。 我计划将模板作为资源包含在内,但找不到一个简洁的方法来继续进行。
非常感谢任何帮助。

https://dev59.com/RHRA5IYBdhLWcg3wuAYo?rq=1 - VMAtm
4个回答

1

快速提问。你为什么需要一个Xml模板?如果你已经预先知道模式,那么只需在代码中生成完整的Xml即可。没有必要加载模板文件。


1

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

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

我觉得这不是最好的做法,所以任何关于更好方法的评论都将不胜感激。特别是,如果我使用LINQ,我是否需要绑定模式,而且,我是否应该有一个模式?我对XML不是很擅长,但我喜欢Vaibhav的想法,即直接从模式生成而不是使用模板。我只是不确定从哪里开始,所以希望得到任何指导!


0

因为您正在使用WebBrowser控件而不是WPF,因此您必须依赖磁盘来加载步骤4中提到的CSS文件。唯一的解决方法是使用像 资源编辑器这样的工具来加载“非托管”资源,并对一些真正的Microsoft 1990s怀旧使用res://协议(http://msdn.microsoft.com/en-us/library/aa767740(VS.85).aspx)。

您仍然需要将数据放入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命名空间中。这些备注可能没有什么帮助,但我尝试了 :)

0

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

考虑到您正在提供XSLT和CSS,为什么不在XHTML中构建页面并内联CSS呢?或者只需将XSLT和CSS文件作为安装程序中的内容添加即可。

编译的帮助实际上就像您所描述的那样 - 您可以从CHM文件中复制链接并使用普通浏览器访问它。我想,根据它们的使用方式,您可以将显示资源嵌入帮助文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接