【问题标题】:LINQ and XDocument: How to create XML file?LINQ 和 XDocument:如何创建 XML 文件?
【发布时间】:2011-06-01 13:05:20
【问题描述】:

我在c#中有一个三个列表,变量名是l_lstData1, l_lstData2, l_lstData3

文件结构是

<FileDetails>  
  <Date FileModified="29/04/2010 12:34:02" />   
  <Data Name="Data_1" DataList="India" Level="2" />   
  <Data Name="Data_2" DataList="chennai" Level="2" />   
  <Data Name="Data_3" DataList="hyderabad" Level="2" />   
  <Data Name="Data_4" DataList="calcutta" Level="2" />  
  <Data Name="Data_5" DataList="vijayawada" Level="1" /> 
  <Data Name="Data_6" DataList="cochin" Level="1" /> 
  <Data Name="Data_7" DataList="madurai" Level="0" />  
  <Data Name="Data_8" DataList="trichy" Level="0" />   
</FileDetails>

3个List的值如下:

 l_lstData1[0] = "India";
 l_lstData1[1] = "chennai";
 l_lstData1[2] = "hyderabad";
 l_lstData1[3] = "calcutta"; 

所以上述 XML(element : Data) 的 level 属性的 value="2"。

 l_lstData2[0] = "vijayawada";
 l_lstData2[1] = "cochin";      

所以上述 XML(element : Data) 的 level 属性的 value="1"。

 l_lstData3[0] = "madurai";
 l_lstData3[1] = "trichy";      

所以上述 XML(元素:Data)的 level 属性的 value="0"。

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    不清楚为什么“级别”属性是指定的,但这会为您创建相关的 XML:

    // Used for side-effects in the XElement constructor. This is a bit icky. It's
    // not clear what the "Name" part is really for...
    int count = 1;
    
    var doc = new XDocument(
        new XElement("FileDetails",
            new XElement("Date", new XAttribute("FileModified", DateTime.UtcNow)),
            l_lstData1.Select(x => new XElement("Data",
                new XAttribute("Name", "Data_" + count++),
                new XAttribute("DataList", x),
                new XAttribute("Level", 2))),
            l_lstData2.Select(x => new XElement("Data",
                new XAttribute("Name", "Data_" + count++),
                new XAttribute("DataList", x),
                new XAttribute("Level", 1))),
            l_lstData3.Select(x => new XElement("Data",
                new XAttribute("Name", "Data_" + count++),
                new XAttribute("DataList", x),
                new XAttribute("Level", 0)))));
    

    如果您可以从列表项中提取投影到其元素,这可能会更整洁,但是"Data_" + count 位使这变得很棘手。说实话,不清楚为什么你需要这样的东西......如果你能摆脱它,代码可能会更干净。

    我想另一种选择是创建文档没有 Name 属性,然后填充它们。例如:

    private static IEnumerable<XElement> ProjectList(IEnumerable<string> list,
        int level)
    {
        return list.Select(x => new XElement("Data",
            new XAttribute("DataList", x),
            new XAttribute("Level", level)));
    }
    

    然后:

    var doc = new XDocument(
        new XElement("FileDetails",
            new XElement("Date", new XAttribute("FileModified", DateTime.UtcNow)),
            ProjectList(l_lstData1, 2),
            ProjectList(l_lstData2, 1),
            ProjectList(l_lstData3, 0)));
    
    int count = 1;
    foreach (var element in doc.Descendants("Data"))
    {
        element.SetAttributeValue("Name", "Data_" + count++);
    }
    

    【讨论】:

      【解决方案2】:

      怎么样:

      XDocument doc = new XDocument();
      
      var total = (from a in list1 select new { Name = a, Level = 2 }).Concat(
                   from b in list2 select new { Name = b, Level = 1 }).Concat(
                   from c in list3 select new { Name = c, Level = 0 });
      
      XElement root = new XElement("FileDetails", from i in Enumerable.Range(0, total.Count())
                                                  let element = total.ElementAt(i)
                                                  let name = new XAttribute("Name", String.Format("Data_{0}", i + 1))
                                                  let level = new XAttribute("Level", element.Level)
                                                  let datalist = new XAttribute("DataList", element.Name)
                                                  select new XElement("Data", name, datalist, level),
                                                  new XElement("Date", new XAttribute("FileModified", DateTime.Now)));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        相关资源
        最近更新 更多