2008-09-01 27 views
5

我想做到以下幾點並不能找到一種優雅的方式:XML在C#中 - 從資源讀取,操作和顯示

  1. 讀取XML模板爲System.Xml.XmlDocument
  2. 用它填充從我的UI數據
  3. XSLT我寫
  4. 將IT應用一個CSS樣式
  5. 渲染到一個WebBrowser控制

我正在從磁盤上的一個文件讀取它,填充它,然後在填充它之後將其保存回磁盤。我參考模板中的XSLTXSLT中的CSS,然後使用WebBrowser.Navigate([filename])方法顯示XML文件。

顯然,當我來部署這個應用程序,它會打破可怕的文件將不會存在於磁盤上,我將無法引用XSLTCSS文件在XML文件,因爲他們」會成爲資源。我打算將這個模板作爲一個資源來使用,但是找不到一個從這裏開始的簡單方法。

非常感謝任何幫助

+0

http://stackoverflow.com/questions/851813/load-an-xml-from-resources?rq=1 – VMAtm 2012-11-15 12:53:07

回答

1

快速的問題。爲什麼你需要一個Xml模板?如果您事先已經瞭解了架構,那麼只需在您的代碼中生成完整的Xml。不應該需要加載模板文件。

0

檢出Linq to XML - 這是寫入和讀取基於Xml的數據的好方法。比System.Xml.XmlDocument機制更容易。

鑑於您提供了XSLT和CSS,爲什麼不用XHTML構建頁面並內聯CSS?或者,只需在您的安裝程序中添加XSLT和CSS文件作爲內容。

編譯的幫助實際上做了類似於您所描述的內容 - 您可以複製CHM文件中的鏈接並使用普通瀏覽器訪問它。我想你可以將你的顯示資源嵌入到幫助文件中,具體取決於它們的使用方式。

1

感謝Keith的鏈接,因爲LINQ在我要學習的東西列表中,所以我會看看那些沒興趣的東西。不幸的是,我需要針對這個應用程序的.Net 2.0,所以我認爲(如果我錯了,請糾正我)LINQ不存在問題。

我已經在XSLT的頭文件中包含了CSS,並且我找到了一種使用System.Xml.Xsl.XslCompiledTransform對象來轉換內存中的XML的方法。我目前使用WebBrowser.DocumentText屬性將格式化的XML傳遞到WebBrowser組件,這似乎工作。

我不禁想到這不是做事的最佳方式,所以任何關於更好的方式的意見,將不勝感激。特別是,如果我使用LINQ,我需要一個模式來綁定,並且我應該有一個模式全程?我對XML並不擅長,但我喜歡Vaibhav從模式直接生成而不是使用模板的想法。我只是不知道從哪裏開始,所以任何指針讚賞!

0

由於您使用WebBrowser控件和 WPF你必須取決於磁盤上加載你提到的CSS文件中的第4步:解決這個問題的唯一方法是使用一個工具,如Resource Hacker加載「非託管「資源,並使用協議(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命名空間。這些說法可能沒有幫助,但我試過:)