سؤال LINQ إلى XML للمبتدئين:إرجاع أكثر من نتيجة

StackOverflow https://stackoverflow.com/questions/127258

  •  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, 
              };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top