【问题标题】:XML to Datatable LINQXML 到数据表 LINQ
【发布时间】:2014-04-17 12:38:00
【问题描述】:

我对 Linq 和 c# 很陌生,很抱歉我的无知。下面是我的xml。

<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))获取具有属性 Value 的 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

我将 xml 输出(项目数据)放入 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);

 }

然后将其放回数据表以供稍后读取。尽管由于只读问题,这不允许我添加 \ 。非常感谢您的建议和帮助。干杯。

【问题讨论】:

    标签: c# xml linq datatable


    【解决方案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 格式是一致的,例如每个 &lt;ItemGroupData&gt; 总是包含 2 个 &lt;ItemData&gt; 元素,并且每个 &lt;ItemData&gt; 必须有 Value 属性。

    【讨论】:

    • 真棒示例伙伴...但是这是我的错...忘记提及我在 .net3.5...所以 type = (string)i.Element(nsSys + "ItemData" ).Skip(1).First().Attribute("Value") 没有方法 Skip 和 First..Cheers..
    • ups,错字。应该是Elements(...).Skip(1)...,你能再试一次吗?
    • Perfect..Works..Descendants.Skip(1).First.... 只是想知道你是否知道如何交换值 这个案例4说先生? LINQ中有方法吗?干杯...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2015-09-16
    • 1970-01-01
    • 2015-10-30
    相关资源
    最近更新 更多