2014-04-17 5 views
1

저는 Linq와 C#에 대해 매우 신감이 많습니다. 아래는 내 XML입니다. XML to Datatable LINQ

<FormData FormOID="F_TABLEOFMODAL_V20" OpenClinica:Version="v2.0" OpenClinica:Status="initial data entry"> 
    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="3" TransactionType="Insert"> 
     <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-04-10" /> 
     <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="4" /> 
    </ItemGroupData> 
    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="1" TransactionType="Insert"> 
     <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-04-01" /> 
     <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="2" /> 
    </ItemGroupData> 
    <ItemGroupData ItemGroupOID="IG_TABLE_MODALITYTABLE" ItemGroupRepeatKey="2" TransactionType="Insert"> 
     <ItemData ItemOID="I_TABLE_MODAL_DATE_TABLE" Value="2014-04-04" /> 
     <ItemData ItemOID="I_TABLE_MODAL_TYPE_TABLE" Value="1" /> 
    </ItemGroupData> 
</FormData> 

는 나중에 사용하는 최초의 예를 두 가지, 즉 (2014-04-10,4)의 덩어리 속성 값과 정보 ItemData을 얻기 위해 노력하고있어. 이것은 내가 한 일이며 매우 생산적이지는 않습니다.

var doc = XDocument.Load(XmlReader.Create(streaming)); 

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

var items = from i in doc.Descendants(nsSys + "ItemData") 
      select new 
      { 
       //item = (string)i.Attribute("ItemOID"), 
       val = (string)i.Attribute("Value") 
      }; 

var oddCategories = items.ToList().Where((c, i) => i % 2 == 0); 
var evenCategories = items.ToList().Where((c, i) => i % 2 != 0); 


//Put it into a datatable 
DataTable modDt = new DataTable(); 
modDt.Columns.Add(new DataColumn("Date", typeof(int))); //odd values 
modDt.Columns.Add(new DataColumn("Type", typeof(int))); //even values 

1x6 목록에 항목 데이터를 가져 오는 중입니다. 그런 다음 그것을 홀수로 나누고 심지어 사용할 데이터 테이블로 다시 놓습니다. 이걸 데이터 테이블에 집어 넣는 방법을 알고 있습니다. 또한 날짜 형식을 2014-04-01에서 04/01/14 (M/D/Y)로 변경하고 싶습니다. 수행 할 생각이었습니다

var itemlist = items.ToArray(); 
var skipped = String.Join(",", itemlist.Select(p => p.ToString()).ToArray()); 
List<string> result = skipped.Split(',').ToList(); 

for (int i = 0; i < result.Count; i += 2) 
{ 
    var ccc = result[i].ToCharArray(); 
    var dd = ccc.Skip(10); 
    var ff = dd.Take(8); 
    var yr = ff.Take(2); 
    var mnth = ff.Skip(3).Take(2); 
    var dte = ff.Skip(6).Take(2); 
    var sss = ee.Concat(mnth).Concat(dte); 

} 

그런 다음 나중에 읽을 수있는 데이터 테이블로 되돌립니다. 그게 내가 읽기 전용 문제 때문에 \ 추가 할 수는 없지만. 귀하의 제안과 도움을 진심으로 감사드립니다. 건배.

답변

1

확인이 예 :

//loop through <ItemGroupData> to get both date and type value 
//from each iteration 
var items = from i in doc.Descendants(nsSys + "ItemGroupData") 
      select new 
      { 
       date = (string)i.Element(nsSys + "ItemData").Attribute("Value"), 
       type = (string)i.Elements(nsSys + "ItemData").Skip(1).First().Attribute("Value") 
      }; 
DataTable modDt = new DataTable(); 
modDt.Columns.Add(new DataColumn("Date", typeof(string))); 
modDt.Columns.Add(new DataColumn("Type", typeof(int))); 

//add LINQ-to-XML query result to DataTable 
foreach (var item in items) 
{ 
    //convert item.date string to DateTime 
    //then convert it back to string with different format 
    modDt.Rows.Add(DateTime.ParseExact(item.date, "yyyy-MM-dd", CultureInfo.InvariantCulture) 
          .ToString("MM/dd/yyyy"), 
        int.Parse(item.type); 
} 

내가 그 XML 형식이 일치 가정, f.e 각 <ItemGroupData>는 항상 2 개 <ItemData> 요소를 포함하고, 각 <ItemData>Value 속성이 있어야합니다.

+0

굉장한 예제 메이트 ... 그러나 그건 내 잘못이야 ... 내가 말했던 것을 잊었습니다 .net3.5 ... 그래서 타입 = (문자열) i.Element (nsSys + "ItemData"). 건너 뛰기 (1) .First(). 속성 ("Value")에는 메소드가 없습니다. Skip and First..Cheers .. – user3276191

+0

ups, typo. 'Elements (...). Skip (1) ...', 다시 시도 할 수 있었습니까? – har07

+0

Perfect..Works..Descendants.Skip (1). 처음에 .... 당신이 값 를 스왑하는 방법을 알고 있다면 궁금해하실 것입니다. LINQ에 메서드가 있습니까? 건배... – user3276191