سؤال

يشبه XML الخاص بي:

<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>

والرمز الخاص بي حتى الآن هو:

XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~/files/{0}/text.xml", "en")));

if (doc != null)
{
    XElement element = doc.Elements().Where(e => e.Elements().Any() && e.Attribute("name").Value == "someKey").First();
}

أحصل على خطأ يقول:

Sequence contains no elements

هو خطأ بلدي خطأ؟

دخلت الرمز، وأخطاء في الخط مع Xelement ..

هل كانت مفيدة؟

المحلول

تريد شيئا مثل هذا:

var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();

يحرر: تم تحريره للاستيلاء على العنصر الأول من النتيجة؛

نصائح أخرى

يمكنك أيضا استخدام:

var element = doc.Elements()
                 .Elements()
                 .Where(e => (e.Elements().Any() 
                              && e.Attribute("name").Value == "somekey"))
                 .First();

تفسير:

ال doc.Elements() الاستيلاء على عنصر الجذر، وهو nodes. وبعد ثم .Elements() يختار عناصر الطفل من ذلك، وهو واحد فقط، node. وبعد ال .Where() ثم يتم تنفيذها على تلك العصيدة، وهو ما تريد. يختار LambDA تلك العناصر التي تحتوي على عناصر أطفال، ولديها أيضا سمة "اسم" بقيمة "قنصر".

الكود الأصلي الخاص بك لم يكن الحصول على عناصر الأطفال. ومن هنا كانت مجموعة النتائج الأصلية فارغة.

يمكنك أيضا القيام بذلك .Descendants() ولكن هذا شعور قذرة قليلا وفقدان بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top