[英]Using attributes to find value linq
我是LINQ初學者,需要一些幫助。 以下是rest查詢生成的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 =“ I_TABLE_MODAL_DATE_TABLE”(ans:兩個日期)和ItemOID =“ I_TABLE_MODAL_TYPE_TABLE”(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);
}
我試圖用單行代碼回答您的問題
var values = document.Descendants("ItemData")
.Where(t => t.Attribute("ItemOID").Value == "I_TABLE_MODAL_DATE_TABLE")
.Select(x => x.Attribute("Value").Value)
在此行之后,值集合將具有所有日期。 同樣可以應用於其他查詢。
更新:假設為連接數據庫到相關表准備了類FormDataContext,下面的解決方案使用linq到sql。
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的示例。 您可以根據需要調整示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.