这可能是我说的最简单的问题。这是我的xml的一部分。我想得到的是基于另一个属性“ItemOID”的属性“Value”。 IE当ItemOID =“I_MEDIC_HISTORY_INDICATION”时是什么值。
<FormData FormOID="F_NEUROLOGICAL_V20" OpenClinica:Version="V2.0" OpenClinica:Status="initial data entry">
<ItemGroupData ItemGroupOID="IG_NEURO_UNGROUPED" ItemGroupRepeatKey="1" TransactionType="Insert">
<ItemData ItemOID="I_NEURO_NEURO_TENDONAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_TENDON" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_GAITAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_GAIT" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_COORDINATEAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_COORDINATE" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_SENSORYAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_SENSORY" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_MUSCLETONEAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_MUSCLETONE" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_MOTORAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_MOTOR" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_CRANIALAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_CRANIAL" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_SPEECHAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_SPEECH" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_BEHAVEAB" Value="abnormal" />
<ItemData ItemOID="I_NEURO_NEURO_BEHAVE" Value="0" />
<ItemData ItemOID="I_NEURO_NEURO_APPEARAB" Value="" />
<ItemData ItemOID="I_NEURO_NEURO_APPEAR" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_NORMAL" Value="1" />
<ItemData ItemOID="I_NEURO_NEURO_DATE" Value="2014-10-10" />
</ItemGroupData>
</FormData>
这是我的代码。你可以告诉我有点卡住了。
string neuroExamPath = "//oc:FormData[@FormOID='F_NEUROLOGICAL_V20']/oc:ItemGroupData/oc:ItemData";
var neuroExamList = doc.XPathSelectElements(neuroExamPath, nsmgr).Reverse();
foreach (var neuroExamElement in neuroExamList)
{
var patrow = patDt.NewRow();
var I_NEURO_NEURO_NORMAL = neuroExamElement.Attribute("Value").Value;
patrow["Neuro_normal"] = I_NEURO_NEURO_NORMAL;
var I_NEURO_NEURO_APPEAR = neuroExamElement.Attribute("Value").Value;
patrow["Neuro_appear"] = I_NEURO_NEURO_APPEAR;
var I_NEURO_NEURO_APPEARAB = neuroExamElement.Attribute("Value").Value;
patrow["Neuro_appearab"] = I_NEURO_NEURO_APPEARAB;
patDt.Rows.Add(patrow);
}
正如您所知,它将一直迭代所有属性Value。但是我需要var I_NEURO_NEURO_NORMAL = neuroExamElement.Attribute(“Value”)。Value;行具有ItemOID =“I_NEURO_NEURO_NORMAL”等条件。所以我可以一次将一个属性放入数据表中。请帮忙。谢谢。
答案 0 :(得分:1)
在我看来,您希望每个ItemGroupData
元素都有一个新行,而不是每个ItemData
元素。我希望有类似的东西:
foreach (var itemGroup in doc.Root.Elements("ItemGroupData"))
{
var row = patDt.NewRow();
row["Neuro_normal"] = itemGroup.ExtractValue("I_NEURO_NEURO_NORMAL");
row["Neuro_appear"] = itemGroup.ExtractValue("I_NEURO_NEURO_APPEAR");
row["Neuro_appearab"] = itemGroup.ExtractValue("I_NEURO_NEURO_APPEARAB");
patDt.Rows.Add(row);
}
使用新的扩展方法:
public static string ExtractValue(this XElement parent, string oid)
{
return parent.Elements("ItemData")
.Where(x => x.Attribute("ItemOID").Value == oid)
.First()
.Attribute("Value")
.Value;
}
或者,如果您要提取属性的批次,则可以构建字典:
var values = itemGroup.Elements("ItemData")
.ToDictionary(x => x.Attribute("ItemOID").Value,
x => x.Attribute("Value").Value);