سؤال LINQ إلى XML للمبتدئين:إرجاع أكثر من نتيجة
-
02-07-2019 - |
سؤال
تحيات!
أنا أعمل على التفاف رأسي حول LINQ.إذا كان لدي بعض XML مثل هذا الذي تم تحميله في كائن XDocument:
<Root>
<GroupA>
<Item attrib1="aaa" attrib2="000" attrib3="true" />
</GroupA>
<GroupB>
<Item attrib1="bbb" attrib2="111" attrib3="true" />
<Item attrib1="ccc" attrib2="222" attrib3="false" />
<Item attrib1="ddd" attrib2="333" attrib3="true" />
</GroupB>
<GroupC>
<Item attrib1="eee" attrib2="444" attrib3="true" />
<Item attrib1="fff" attrib2="555" attrib3="true" />
</GroupC>
</Root>
أرغب في الحصول على قيم السمات لجميع العناصر الفرعية للعنصر في عنصر المجموعة.إليك ما يبدو عليه استعلامي:
var results = from thegroup in l_theDoc.Elements("Root").Elements(groupName)
select new
{
attrib1_val = thegroup.Element("Item").Attribute("attrib1").Value,
attrib2_val = thegroup.Element("Item").Attribute("attrib2").Value,
};
يعمل الاستعلام، ولكن إذا كان متغير groupName على سبيل المثال يحتوي على "GroupB"، فسيتم إرجاع نتيجة واحدة فقط (عنصر العنصر الأول) بدلاً من ثلاث.هل فاتني شيء؟
المحلول
XElement e = XElement.Parse(testStr);
string groupName = "GroupB";
var items = from g in e.Elements(groupName)
from i in g.Elements("Item")
select new {
attr1 = (string)i.Attribute("attrib1"),
attr2 = (string)i.Attribute("attrib2")
};
foreach (var item in items)
{
Console.WriteLine(item.attr1 + ":" + item.attr2);
}
نصائح أخرى
نعم، يقوم .Element() بإرجاع العنصر المطابق الأول فقط.تريد .Elements() وتحتاج إلى إعادة كتابة الاستعلام الخاص بك إلى حد ما:
var results = from group in l_theDoc.Root.Elements(groupName)
select new
{
items = from i in group.Elements("Item")
select new
{
attrib1_val = i.Attribute("attrib1").Value,
attrib2_val = i.Attribute("attrib2").Value
}
};
إليك نموذج طريقة الاستعلام للإجابة:
var items =
e.Elements("GroupB")
.SelectMany(g => g.Elements("Item"))
.Select(i => new {
attr1 = i.Attribute("attrib1").Value,
attr2 = i.Attribute("attrib2").Value,
attr3 = i.Attribute("attrib3").Value
} )
.ToList()
الاحتمال الآخر هو استخدام جملة حيث:
var groupName = "GroupB";
var results = from theitem in doc.Descendants("Item")
where theitem.Parent.Name == groupName
select new
{
attrib1_val = theitem.Attribute("attrib1").Value,
attrib2_val = theitem.Attribute("attrib2").Value,
};
لا تنتمي إلى StackOverflow