2016-07-09 81 views
0

我有從csv文件加載的對象列表,我的目標是將其寫入xml並下載它。分組列表Linq的子列表

這裏就像這種原始的CSV文件中的數據:

A 1 str1 1001 
A 1 str2 1002 
A 1 str2 1003 
B 2 str3 1004 
B 2 str3 1005 

和輸出XML DTA應該是這樣的:

<MyHeader> 
    <columnHeader1 foo='A' order='1'> 
     <columnHeader2 title="str1"> 
     <columnHeader3 id="1001"/> 
     </columnHeader2> 
     <columnHeader2 title="str2"> 
      <columnHeader3 id="1002" /> 
      <columnHeader3 id="1003" /> 
     </columnHeader2> 
    </columnHeader1> 
<columnHeader1 foo='B' order='2'> 
     <columnHeader2 title="str3"> 
     <columnHeader3 id="1004"/> 
     <columnHeader3 id="1005"/> 
     </columnHeader2> 
    </columnHeader1> 
... 

這裏是模型界定及

public class foo 
    { 
     public string letter { get; set; } 
     public string order { get; set; } 
     public string title { get; set; } 
     public string titleid { get; set; } 
    } 

我怎麼能prepeare這個XML文件與上面的模型列表?

+3

有幾個方法可以做到這一點,但你有什麼企圖問這個問題之前做?你是如何閱讀CSV文件的?你是如何嘗試編寫XML的?如果情況確實如此,我們可以幫助你解決問題。 –

+1

我建議看看csv helper:https://joshclose.github.io/CsvHelper/ - 這將允許你迭代你的csv文檔中的記錄,在這一點你可以將它們作爲你的「foo」類,將它們添加到列表中。然後查詢,分組,輸出。但是我和丹德雷在這裏,到目前爲止做了什麼? – pimbrouwers

+0

@Dandré我只需要將foo的列表寫入上面的xmk文件,我已經讀取並加載數據到列表中。我使用簡單的xmlserializer,但我的數據格式必須如上所示.. – TyForHelpDude

回答

1

假設數據以下述方式進行排序:字母=>標題=> ID

的最簡單的解決方案可以是隻使用一個環和一個StringBuilder來連接字符串:

StringBuilder xmlBuilder = new StringBuilder(); 
string letter = string.Empty; 
string title = string.Empty; 

xmlBuilder.Append("<MyHeader>"); 

foreach (foo item in foos) 
{ 
    if (title != string.Empty && item.title != title) 
    { 
     xmlBuilder.Append("</columnHeader2>"); 
    } 

    if (letter != string.Empty && item.letter != letter) 
    { 
     xmlBuilder.Append("</columnHeader1>"); 
    } 

    if (item.letter != letter) 
    { 
     letter = item.letter; 
     xmlBuilder.AppendFormat("<columnHeader1 foo='{0}' order='{1}'>", item.letter, item.order); 
    } 

    if (item.title != title) 
    { 
     title = item.title; 
     xmlBuilder.AppendFormat("<columnHeader2 title=\"{0}\">", item.tile); 
    } 

    xmlBuilder.AppendFormat("<columnHeader3 id=\"{0}\" />", item.titleid) 
} 

xmlBuilder.Append("</columnHeader2>"); 
xmlBuilder.Append("</columnHeader1>"); 
xmlBuilder.Append("</MyHeader>"); 

希望它有助於!

+0

對我來說足夠了,謝謝 – TyForHelpDude

+0

雖然這對於當前的解決方案來說簡單而有效,但無論如何都要看看XML序列化。它將爲您節省大量的時間在您的XML中添加另一個字段,而不是查看字符串並找出由於額外字段而需要更改的字符串。 –

2

您可以使用LINQ來分組數據。爲了使這個代碼工作,我已將foo類型Foo更名爲允許我使用名爲foo的變量。變量foosFoo對象的集合。

var groupedData = from foo in foos 
        group foo by new { foo.letter, foo.order } into outerGroup 
        from innerGroup in 
         (from foo in outerGroup 
         group foo by foo.title) 
        group innerGroup by outerGroup.Key; 

正如你可以看到該序列被第一分組的複合鍵letterorder然後每個外組內的Foo對象由title分組。

使用LINQ到XML,那麼你可以將分組數據轉換成XML層次:

var root = new XElement(
    "MyHeader", 
    groupedData.Select(
    outerGroup => new XElement(
     "columnHeader1", 
     new XAttribute("foo", outerGroup.Key.letter), 
     new XAttribute("order", outerGroup.Key.order), 
     outerGroup.Select(
     innerGroup => new XElement(
      "columnHeader2", 
      new XAttribute("title", innerGroup.Key), 
      innerGroup.Select(
      foo => new XElement(
       "columnHeader3", 
       new XAttribute("id", foo.titleid) 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
);