سؤال

أحاول منع وجود قيم NULL عندما أقوم بتحليل ملف XML إلى كائن مخصص باستخدام LINQ.

لقد وجدت حلاً رائعًا لهذا مدونة سكوت جو, ولكن لسبب ما لا يعمل مع الأعداد الصحيحة.أعتقد أنني استخدمت نفس بناء الجملة ولكن يبدو أنني أفتقد شيئًا ما.أوه، ولسبب ما، فإنه يعمل عندما لا تكون العقدة فارغة.

يوجد أدناه مقتطف من الكود الخاص بي.

List<GrantAgresso> lsResult = (from g in xml.Element("root").Elements("Elementname")
        select new GrantAgresso()
        {
             Year = (int?)g.Element("yearnode") ?? 0,
             Subdomain = (string)g.Element("domainnode") ?? ""
        }).ToList();

رسالة الخطأ هي:

سلسلة الإدخال ليس بتنسيق الصحيح.

إذا كان أي شخص لديه فكرة عن ما أفعله خطأ، الرجاء المساعدة :)

يحرر:قطعة من XML (أسماء غريبة ولكنها ليست اختياريًا)

<Agresso>
  <AgressoQE>
    <r3dim_value>2012</r3dim_value>
    <r0r0r0dim_value>L5</r0r0r0dim_value>
    <r7_x0023_province_x0023_69_x0023_V005>0</r7_x0023_province_x0023_69_x0023_V005>
    <r7_x0023_postal_code_x0023_68_x0023_V004 />
    <r7_x0023_country_x0023_67_x0023_V003>1004</r7_x0023_country_x0023_67_x0023_V003>
    <r7_x0023_communitydistrict_x0023_70_x0023_V006>0</r7_x0023_communitydistrict_x0023_70_x0023_V006>
  </AgressoQE>
</Agresso>
هل كانت مفيدة؟

المحلول

طريقة التمديد التالية ستعود 0 كلاهما إذا كان العنصر غير موجود، فإن العنصر فارغا أو أنه يحتوي على سلسلة لا يمكن تحليلها إلى عدد صحيح: giveacodicetagpre.

يمكنك استخدامه مثل هذا: giveacodicetagpre.

أو إذا كنت مستعدا للنظر في تكلفة الانعكاس وقبول القيمة الافتراضية لأي نوع قيمة، فقد تستخدم طريقة الملحق هذه: giveacodicetagpre.

واستخدامها: giveacodicetagpre.

نصائح أخرى

وهذا التعبير هو الذي يرمي:

(int?)g.Element("yearnode")

وذلك لأنه إذا كانت القيمة الفعلية للعقدة النصية للعنصر String.Empty و لا null, ، نظرًا لأن السلسلة الفارغة ليست تنسيقًا صالحًا لـ Int32.Parse, ، فشلت محاولة الإلقاء.

إذا كان العنصر مفقودًا تمامًا من ملف XML الخاص بك، فسيعمل هذا كما تتوقع، ولكن إذا كانت هناك علامة فارغة <yearnode/> أو <yearnode></yearnode>, ، سوف تحصل على الاستثناء.

يمكنك إضافة Where operator

.....
.Where(a => ! string.IsNullOrEmpty(a)).ToList();

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

الرسالة Input string was not in a correct format يبدو مثل الذي ألقيت به int.parse () لذلك يمكن أن يكون لديك yearnode بقيمة (ليست فارغة) ولكن لا يمكن تحليلها بنجاح إلى قيمة عددية.

شئ ما مثل هذا قد إصلاحه:

List<GrantAgresso> lsResult = (from g in xml.Element("root").Elements("Elementname")
    let yearNode = g.Element("yearnode")
    select new GrantAgresso
    {
         Year = string.IsNullOrWhiteSpace(yearNode.Value) ? 0 : int.Parse(yearNode.Value),
         Subdomain = g.Element("domainnode").Value
    }).ToList();

زوجان من الأشياء ملاحظة:

select new GrantAgresso - لا تحتاج إلى أقواس للمنشئ الافتراضي مع مُهيئات الكائنات.

string.IsNullOrWhiteSpace - تم تقديمه في .net 4.0، استخدم string.IsNullOrEmpty إذا كنت على 3.5 أو قبل ذلك

g.Element("domainnode").Value - سيعود دائمًا بسلسلة

إذا كنت تريد قيمة فارغة للسنة بدلاً من 0، فاستخدم (int?)null بدلاً من 0

مشكلتك هي أن يلقي من xelement إلى int؟يستخدم طريقة Int.Parse على قيمة سلسلة Xelement، والتي في حالتك هي String.Ampty.النتائج التالية في نفس الخطأ: giveacodicetagpre.

يمكنك تجنب ذلك عن طريق إلقاء أول Xelement إلى السلسلة والتحقق مما إذا كان لاغيا أو فارغا وفقط إذا لم يكن يفعل المصبوب إلى Int؟للقيام بذلك، استبدل giveacodicetagpre.

مع giveacodicetagpre.

ليست جميلة وسوف تظل رمي إذا كانت السلسلة غير قانونية، لكنها تعمل إذا كنت تستطيع أن تفترض أن العنصر هو دائما عدد صحيح أو فارغ / فارغ.

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