2016-07-09 74 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) 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
);