我是linq的新手,在这个问题上被困了几天。下面是我的例子的xml。
<
<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区分为DATE和TYPE,然后将其放入已创建的数据表列中。下面是我当前的尝试,它只连接行而不是将数据放入两个创建的列中。非常感谢你的帮助。任何意见是极大的赞赏。欢呼声。
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 :(得分: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();