جملة إذا كان البيان فيما يتعلق XML في سيلفرلايت WP7 التطبيق

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

سؤال

الجميع!لم أتمكن من العثور على البرنامج التعليمي شرح الطريقة الصحيحة رمز هذا.وأعتقد أنه سوف يكون واضح من العنوان و الرمز ما أحاول القيام به.اثنين من الأخطاء أنا تلقي هذا إذا كان البيان هو في المكان الخطأ ، وأن المتغير 'السهم' يتم تعيين ولكنها لم تستخدم.أعرف أن هذا يأتي إلى أسفل إلى جملة بسيطة ، لذا أشكر الجميع على الوقت.

void DATABASEinfo_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null)
            return;

        XElement xmlitem = XElement.Parse(e.Result);

        var list = new List<DATABASEinfoViewModel>();            


        foreach (XElement item in xmlitem.Element("channel").Elements("item"))
        {
            var title = item.Element("title");
            var titlevalue = (title == null) ? null : title.Value;
            var description = item.Element("description");
            var descriptionvalue = (description == null) ? null : description.Value;                
            var arrow = (xmlitem.Element("title").Value.Contains("DATABASE Up"))
                ? "up" : null;


            list.Add(new DATABASEinfoViewModel
            {
                Title = titlevalue,
                Description = descriptionvalue,
                Arrow = arrow,                   
            });
        }                       

        DATABASEinfoList.ItemsSource = list;           
    }          

    public class DATABASEinfoViewModel
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Arrow { get; set; } 

الغريب إن التغيير:

var arrow = (xmlitem.Element("title").Value.Contains("DATABASE Up"))

إلى:

var arrow = (xmlitem.Element("channel").Value.Contains("DATABASE Up"))

فإنه يعرض "حتى" على جميع المشاركات.هنا هو مثال على ملف XML:

<rss version="2.0">
<channel>
<title> DATABASE Status</title>
<description>DATABASE status updates</description>      

<item>
<title>First status is DATABASE Up</title>
<description>First Content</description>
</item>

<item>
<title>Second status is DATABASE Up</title>
<description>Second Content</description>
</item>

</channel>
هل كانت مفيدة؟

المحلول

الخط

var arrow = (xmlitem.Element("title").Value.Contains("DATABASE Up")) 

يجب أن يكون في الواقع

var arrow = (item.Element("title").Value.Contains("DATABASE Up")) 

يجب أن تستفسر بند, ، ليس xmlitem.

كما هو مذكور في إجابات أخرى ، يجب عليك أيضًا التحقق من وجود العناصر قبل الوصول إلى قيمها.

نصائح أخرى

إذا لم ترد نتيجة يمكنك تعيينها إلى VAR Arrow.

أين تحاول أن تفعل شيئًا كهذا؟

    string arrow = "";
    if (xmlitem.Element("description").Value.Contains("DATABASE Up"))
    {
        arrow = ("up");                
    }   

انها ليست واضحة تماما بالنسبة لي ما كنت تحاول القيام به.إذا كان description يحتوي على "قاعدة بيانات" تريد قيمة arrow أن تكون "حتى" وإلا ماذا ؟ فارغة?

string arrow = null;

if (xmlitem.Element("description").Value.Contains("DATABASE Up")) 
{ 
    arrow = ("up");                 
}                 

أو

var arrow = (xmlitem.Element("description").Value.Contains("DATABASE Up"))
            ? "up" : null;

تحرير

و لماذا وضع DATABASEinfoList.ItemsSource = list سواء داخل حلقة foreach ومرة أخرى في الخارج ؟ واحد داخل أن تذهب بعيدا.

أيضا هناك مشكلة متأصلة, مبين من تعليقك في ميك الجواب..هذه الدعوات:

 item.Element("[elementName]").Value

نفترض أن عنصر موجود.إذا كان لا عليك الاتصال Value العقار حاصل على null, رمي NullReferenceException.إذا كان هناك فرصة أن يكون العنصر null, ثم تحتاج إلى التحقق من ذلك قبل أن يدعو القيمة:

 var element = item.Element("[elementName]");
 var value = (element == null) ? null : element.Value;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top