使用属性查找值linq

时间:2014-05-20 08:57:33

标签: c# linq datatable attributes

我是LINQ的初学者,需要一些帮助。下面是休息查询生成的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>

我想要的是ItemOID。我的问题是有没有办法获得所有ItemOID =&#34; I_TABLE_MODAL_DATE_TABLE&#34;(ans:两个日期)和ItemOID =&#34; I_TABLE_MODAL_TYPE_TABLE&#34; (ans:两个数字)。下面的代码可以工作,但是它使用ItemData作为第一个元素(称为日期),然后跳过一个到第二个元素(类型)。

////Print out xml to use?
                    var doc = XDocument.Load(XmlReader.Create(streaming));

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

                    //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.Descendants(nsSys + "ItemData").Skip(1).First().Attribute("Value")
                            };
                    //Catch here?

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

                    //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/yy"),
                                       int.Parse(item.type));
                    }

                    //Value of OC output
                    //1=mr,2=ct,3=pet,4=us,5=meg,6=ecg (put if statements before xnat rest ssh string)
                    for (int i = 0; i <= modDt.Rows.Count - 1; i++)
                    {
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("1", "mr");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("2", "ct");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("3", "pet");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("4", "us");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("5", "meg");
                        modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("6", "ecg");
                    }

我开始编写下面显示的代码。将数据添加到数据表仍然不起作用。然而,我想要做的事情的想法就在那里。

            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 itd = document.Descendants(nsSys + "ItemData")
               .Where(t => (string)t.Attribute("ItemOID") == "I_TABLE_MODAL_DATE_TABLE");

            var itds = itd.Attributes("Value").ToArray();

            foreach (var it in itds)
            {
                var subA = it.ToString();
                var subAA = subA.ToCharArray();
                var subB = subAA.Skip(9).Take(8).ToArray();

                string sub = new string(subB);
                var subBB = sub.Split('-').ToArray();
                string subC = subBB[1] + "/" + subBB[2] + "/" + subBB[0];
                foreach (DataRow dr in modDt.Rows)
                {
                    dr["Date"] = subC;  
                }

                Console.WriteLine(subC);                
            }

            var itt = document.Descendants(nsSys + "ItemData")
               .Where(t => (string)t.Attribute("ItemOID") == "I_TABLE_MODAL_TYPE_TABLE");

            var itty = itt.Attributes("Value").ToArray();

            foreach (var et in itty)
            {
                var subz = et.ToString();
                var subzz = subz.ToCharArray();
                var subx = subzz.Skip(7).Take(1).ToArray();
                string subxx = new string(subx);

                foreach (DataRow dt in modDt.Rows)
                {
                    dt["Type"] = subxx;
                }

                Console.WriteLine(subxx);
            }

            //for (int i = 0; i <= modDt.Rows.Count - 1; i++)
            //{
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("1", "mr");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("2", "ct");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("3", "pet");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("4", "us");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("5", "meg");
            //    modDt.Rows[i][1] = modDt.Rows[i][1].ToString().Replace("6", "ecg");
            //}

            foreach (DataRow row in modDt.Rows) // Loop over the rows.
            {
                string sessionDate = row["Date"].ToString();
                string mod = row["Type"].ToString();
                string drow = "aa" + sessionDate + "bb" + mod + "cc"; 
                Console.WriteLine(drow);
            }

            Console.Read();

非常感谢你的帮助和时间。非常感谢。欢呼声。

当前尝试

            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);


            }

1 个答案:

答案 0 :(得分:0)

我想用一行代码回答你的问题

var values = document.Descendants("ItemData")
           .Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_DATE_TABLE")
           .Select(x => x.Attribute("Value").Value)

在此行之后,值集合将包含所有日期。同样也可以应用于其他查询。

更新:以下解决方案使用linq to sql,假设类FormDataContext已准备好将数据库连接到相关表。

FormDataContext db = new FormDataContext();

[Table(Name = "FormData")]
public class FormData
{
        [Column]
        public DateTime Date;
        [Column]
        public int Type;
}

IEnumerable<FormData> values = document.Descendants("ItemGroupData").Select(t => { 
    return new FormData {
        FormDate = Convert.ToDateTime(t.XPathSelectElement("ItemData[@ItemOID='I_TABLE_MODAL_DATE_TABLE']").Attribute("Value").Value),
        Type = Convert.ToInt32(t.XPathSelectElement("ItemData[@ItemOID='I_TABLE_MODAL_TYPE_TABLE']").Attribute("Value").Value)
    }; 
});


foreach (FormData data in values) {
    db.Form.InsertOnSubmit(data);
}

db.SubmitChanges();

这只是将所需的两个字段存储到db的示例。您可以根据自己的需要调整示例。