[英]Linq to XML get nested child attribute based on parent attribute
我需要一些LINQ to XML的幫助。 我很想恢復到XPath,但是非常渴望正確地學習LINQ to XML。 因此,下面是我的XML的精簡版本:
<SData Key="626">
<Event OID="INITIALVISIT">
<FData FID="MODAL_V10">
<IGData IOID="MODALITYTABLE">
<Item OID="I_TABLE_MODAL_DATE_TABLE" Value="2015-06-03" />
<Item OID="I_TABLE_MODAL_TYPE_TABLE" Value="1" />
</IGData>
<IGData IOID="MODALITYTABLE2">
<Item OID="I_TABLE_MODAL_DATE_TABLE2" Value="2015-06-09" />
<Item OID="I_TABLE_MODAL_TYPE_TABLE2" Value="1" />
</IGData>
</FData>
<FData FID="UPLOAD_V40">
<IGData IOID="IG_IMAGE_UNGROUPED">
<Item OID="I_IMAGE_UPLOAD_XNAT" Value="1" />
<Item OID="I_IMAGE_UPLOAD_COMPLETE" Value="1" />
</IGData>
<IGData IOID="IG_IMAGE_UPLOAD">
<Item OID="I_IMAGE_UPLOAD_XNAT" Value="1" />
<Item OID="I_IMAGE_UPLOAD_COMPLETE" Value="1" />
</IGData>
</FData>
</Event>
<Event OID="FOLLOWUPVISIT">
...
...
</Event>
我想要實現的是為每個事件獲取attributeOID =“ I_IMAGE_UPLOAD_COMPLETE”的Item值。 到目前為止,這就是我所擁有的。
XNamespace occ = "http://www.cdisc.org/ns/odm/v1.3";
XNamespace aoc = "http://www.openclinica.org/ns/odm_ext_v130/v3.1";
var datasubject = data_oc.Descendants(occ + "SData");
var event = datasubject.Elements(occ + "Event").Attributes("OID");
foreach (var items in event)
{
string EventTypes = items.Value.ToString();
foreach (var itemData in EventTypes)
{
var Data = from el in datasubject.Descendants(occ + "Event")
where (string)el.Attribute("OID=") == itemData
select(string)el;
}
}
謝謝。
var doc=XDocument.Parse(@"your xml");
//Via Linq
var viaLinq=doc.Elements()
.SelectMany(e => e.Elements())
.SelectMany(e => e.Elements())
.SelectMany(e => e.Elements())
.SelectMany(e => e.Elements())
.Where(w => w.Attribute("OID").Value=="I_IMAGE_UPLOAD_XNAT")
.Select(e => e.Attribute("Value").Value);
//Even better use Xpath. It makes all this very simple
var viaXPath=doc.XPathSelectElements("//Item[@OID='I_IMAGE_UPLOAD_XNAT']")
.Select(e => e.Attribute("Value").Value);
嘗試此操作,不確定在性能方面如何運作良好。
XDocument po = XDocument.Load("XMLFile1.xml");
// LINQ to XML query
var list1 = po.Descendants("Event")
.Select(x =>
x.Descendants("Item").Where(t =>
(string)t.Attribute("OID") == "I_IMAGE_UPLOAD_COMPLETE").Select(m =>
new { Event = x, AttributeValue = m.Attribute("Value") })
).Where(f => f.FirstOrDefault() != null).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.