2010-08-26 69 views
0

此代碼XML使用LINQ

XmlDataDocument xmlDataDocument = new XmlDataDocument(ds); 

不爲我工作,因爲節點名稱從列的編碼ColumnName屬性導出並會像‘last_x20_name’,例如。這我不能用於生成的Excel電子表格。爲了處理列名使其更加友好,我需要自己生成XML。

我喜歡的LINQ to XML,以及響應this question的一個包含以下片段:

XDocument doc = new XDocument(new XDeclaration("1.0","UTF-8","yes"), 
new XElement("products", from p in collection 
select new XElement("product", 
    new XAttribute("guid", p.ProductId), 
    new XAttribute("title", p.Title), 
    new XAttribute("version", p.Version)))); 

整個目標是從數據集中動態派生列名,因此硬編碼他們是不是一種選擇。這可以用Linq完成,而不需要更長的代碼?

+0

爲什麼你的列名中有空格?解決這個問題,你已經解決了這個問題。 – 2010-08-26 20:08:49

+0

我需要操縱列名稱,我想以通用的方式做到這一點,以便我可以重用代碼。你的評論是最無助的。 – cdonner 2010-08-26 20:48:16

回答

1

我欣賞的答案,但我不得不完全放棄這種做法。我設法生成了我想要的XML(雖然不是Linq),但當然有一個原因,爲什麼XmlDataDocument構造函數的默認實現使用EncodedColumnName - 即在XML中的元素名稱中不允許使用特殊字符。但是因爲我想用XML將使用XSLT的簡單CSV文件轉換爲XML Spreadsheet格式(客戶抱怨在將原始CSV加載到Excel時丟失郵政編碼中的前導0等),我不得不查看在Excel中保存數據的方式。

但是,其最終目標是生成CSV文件以上傳到工資處理器,並且他們要求列名不符合XML規範(例如「文件編號」)。數據在上傳之前由人類審查,並且他們使用Excel。

畢竟,我使用硬編碼XSLT中的列名。

+0

很好的答案。我有一些類似於城市數據庫的特性 – Luke101 2010-09-14 01:24:10

2

它應該是可能的。

爲了使用您的數據集作爲源,您需要Linq-to-Dataset

那麼你就需要一個嵌套查詢

// untested 
var data = new XElement("products", 
    from row in ds.Table["ProductsTable"].Rows.AsEnumerable() 
    select new XElement("product", 
    from column in ds.Table["ProductsTable"].Columns // not sure about this 
    select new XElement(colum.Fieldname, rows[colum.Fieldname]) 
    )); 
+0

Columns集合不是可查詢的,並且AsEnumerable()也沒有爲它定義,所以我猜這不能在不知道列名的情況下完成。 – cdonner 2010-08-26 20:32:51

+2

剛走Columns.Cast () – 2010-08-26 20:51:54