2014-05-21 43 views
0

我是一个linq的新手,并且在这个问题上停留了几天。下面是我的例子的xml。将两个Linq查询数据放入两个单独的数据列

<

    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="1" TransactionType="Insert"> 
         <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-05-01" /> 
         <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="1" /> 
        </ItemGroupData> 
        <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="2" TransactionType="Insert"> 
         <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-05-02" /> 
         <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="2" /> 
        </ItemGroupData> 

我试图做到的,是分化的ItemData为日期和类型,然后放入已创建一个数据表列。以下是我目前的尝试,它只连接行而不是将数据放入两个创建的列中。非常感谢你的帮助。任何意见是极大的赞赏。干杯。

  DataTable modDt = new DataTable(); 
      modDt.Columns.Add(new DataColumn("Date", typeof(string))); 
      modDt.Columns.Add(new DataColumn("Type", typeof(string))); //changed to string? 

      var document = XDocument.Load("doc.xml"); 

      XNamespace nsSys = "http://www.cdisc.org/ns/odm/v1.3"; 

      //Get nodes separated by inner child element 
      var values = document.Descendants(nsSys + "ItemData") 
      .Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_DATE_TABLE") 
      .Select(x => x.Attribute("Value").Value); 

      foreach (var item in values) 
      { 
       modDt.Rows.Add(DateTime.ParseExact(item, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("MM/dd/yy"),null); 
      } 


      var typevalues = document.Descendants(nsSys + "ItemData") 
      .Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_TYPE_TABLE") 
      .Select(x => x.Attribute("Value").Value); 

      foreach (var item in typevalues) 
      { 
       modDt.Rows.Add(null ,int.Parse(item)); 
      } 

      foreach (DataRow row in modDt.Rows) 
      { 
       string sessionDate = row["Date"].ToString(); 
       string mod = row["Type"].ToString(); 

       string xnatCli = mod + sessionDate; 
       Console.Write(xnatCli); 
      } 

      Console.Read(); 

回答

0

你在你的代码中的一些假设的I_TABLE_MODAL_DATE_TABLE和I_TABLE_MODAL_TYPE_TABLE总会匹配。我发布的代码做了额外的检查,以确保这是一个正确的假设。还将它们分组,以便我们为每个有效的ItemGroupData获得一行。如果其中一个属性丢失,它只是添加有效的一个,如果两者都丢失,则跳过该行。此外,如果有多个具有相同名称的属性,则代码只会使用ItemGroupData中的最后一个。

var modDt = new DataTable(); 
modDt.Columns.Add(new DataColumn("Date", typeof(DateTime))); 
modDt.Columns.Add(new DataColumn("Type", typeof(int))); 

var document = XDocument.Load("doc.xml"); 

XNamespace nsSys = "http://www.cdisc.org/ns/odm/v1.3"; 

//Get ItemData attributes group by the itemGroupData 
var itemGroupDatas = 
    document.Descendants(XName.Get("ItemGroupData", nsSys.NamespaceName)) 
      .Elements(XName.Get("ItemData", nsSys.NamespaceName)) 
      .Select(x => new 
       { 
        itemOID = x.Attribute(XName.Get("ItemOID")), 
        value = x.Attribute(XName.Get("Value")) 
       }) 

      .Where(
       x => 
       x.itemOID != null && x.value != null && 
       (x.itemOID.Value == "I_TABLE_MODAL_DATE_TABLE" || 
       x.itemOID.Value == "I_TABLE_MODAL_TYPE_TABLE")) 
      .GroupBy(x => x.itemOID.Parent.Parent, x => x); 

foreach (var itemGroupData in itemGroupDatas) 
{ 
    // record per each group 
    var row = modDt.NewRow(); 
    foreach (var itemData in itemGroupData) 
    { 
     if (itemData.itemOID.Value == "I_TABLE_MODAL_DATE_TABLE") 
     { 
      DateTime date; 
      if (DateTime.TryParse(itemData.value.Value, out date)) 
      { 
       row["Date"] = date; 
      } 
     } 
     if (itemData.itemOID.Value == "I_TABLE_MODAL_TYPE_TABLE") 
     { 
      int type; 
      if (int.TryParse(itemData.value.Value, out type)) 
      { 
       row["Type"] = type; 
      } 
     } 
    } 
    modDt.Rows.Add(row); 
} 
Console.ReadLine(); 
+0

为您的解决方案欢呼。这是一个非常好的解决方案。然而我得到的日期稍微偏离。它给了我。 01/05/2014 00:00:00和02/05/2014 00:00:00。我想得到05/01/14和02/05/14。干杯。 – user3276191

+0

C#不只有日期类型。它始终是DateTime。如果你只想要日期部分,你可以通过执行date.ToShortDateString()将它转换为一个字符串。 – CharlesNRice