2013-04-16 98 views
2

我有一個程序查詢數據庫並報告結果。這裏是我的查詢:如何使用Linq讀取XML

Select Service, Total 
From Services 
Where dtcreated between @startdate and @enddate 

dataset將此報告給reportviewer1命名該數據集

然後我這裏有一個XML文件是XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Database.--> 
<config> 
    <goals> 
      <service1>4</service1> 
      <service2>3</service2> 
     </goals> 
</config> 

的XML(位置C:\config.xml)報告到Reportviewer2

我想要做的是通過電子郵件查詢的結果,以及服務的價值來自xml文件的目標。我可以使用LINQ放在一起表從數據集通過電子郵件發送我的代碼如下:

Dim xelement As XElement = xelement.Load("C:\Config.xml") 
Dim employees As IEnumerable(Of XElement) = xelement.Elements() 

    Dim test = _ 
    <html><body><table><tr><th>Service</th><th>Total Sold</th><th>Goals</th></tr> 
     <%= From service In Me.Dataset.datatable.AsEnumerable _ 
      Select <tr><td><%= service.Service_Category.ToString %></td> 
         <td><%= service.Total_Sold.ToString %></td> 
         <%= From XMLFile In xelement.Descendants("goals").AsEnumerable _ 
          Select <td><%= XMLFile.Descendants("goals").Value %></td> %></tr> %> 
     </table></body></html> 

現在,我想這樣做在同一個表中包含XML文件的值是什麼在上述數據構建的第3列中報告。第三列,你可以看到我想成爲「目標」,它應該顯示4,然後3根據我的配置文件。我如何在上面的Linq和HTML構建中包含我的xml文件的值?這裏是我的輸出現在看起來像:

Service Total Sold Goals 
Service1  51 
Service2  12 

正如你看到的我是從配置文件中缺少「4」和「3」。

這是我希望我的輸出看起來像:

Service Total Sold Goals 
Service1 51   4 
Service2 12   3 
+0

另外的代碼,我只是在VB.NET中提到的內聯XML ... _OUCH!_模板文件資源有什麼問題? –

+0

不知道我知道如何使用一個模板文件資源,我仍然會遇到同樣的問題,填充上面的表格與信息...我可以在編譯後編輯配置文件嗎?目標將每月/每年更改,因此我需要一種方式來報告目標。這是一個自動化程序,它將查詢數據庫,查看我們的目標設置,建立表格,然後通過電子郵件發送表格。 – Shmewnix

+0

@GrantThomas如果有一件事情我希望我可以在繁瑣的測試設置和斷言中使用,那麼當我編寫我的C#時,它將是內聯XML。 –

回答

2

您可以使用LINQ與(希望的對象已存在,或者您可以創建一個)到XML做到這一點,利用linqpad得到查詢正確的。

的代碼來獲取XML文檔

  private static XDocument GetXmlDataFromFileName(string fileName) 
      { 
       // read the xml file into memory 
       return XDocument.Load(new FileStream(String.Format(@"C:\<some path>\{0}.xml", fileName), FileMode.Open)); 
      } 

擴展方法.value的,因此修剪沒有必要的結果,但我用它做的空間在年底或如果值不存在的空字符串。

public static class XmlExtensions 
{ 
    public static String ValueTrim(this XElement element) 
    { 
     return element != null ? element.Value.Trim() : ""; 
    } 
} 

讀取XML數據轉換成對象

  // read the xml file into memory 
      var doc = GetXmlDataFromFileName("FormsPersistence"); 
      var data = (from attrib in doc.Descendants("FormsPersistenceDs").Descendants("Properties") 
         select new FormsPersistence 
         { 
          Id = Guid.NewGuid(), 
          FormName = attrib.Element("FormName").ValueTrim(), 
          ControlName = attrib.Element("ControlName").ValueTrim(), 
          Property = attrib.Element("Property").ValueTrim(), 
          PropertyValue = attrib.Element("PropertyValue").ValueTrim() 
         }).ToList(); 

的文件模板

<?xml version="1.0" standalone="yes"?> 
<FormsPersistenceDs> 
    <Properties> 
    <FormName>Form1</FormName> 
    <ControlName>mainNaviBar</ControlName> 
    <Property>Width</Property> 
    <PropertyValue>275</PropertyValue> 
    </Properties> 
</FormsPersistenceDs>