محاولة استخدام removechild () على Xmlnodelist يفسد مجموعة Xmlnode الخاصة بي

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

سؤال

أحاول إزالة عقدة معينة من XMlnodelist المسمى ListaWidths. تحتوي هذه القائمة المحددة على 5 عناصر قبل استخدام removechild (). ولكن ، بعد بيان removechild () ، تبقى القائمة فقط مع عنصر واحد.

XmlNodeList listaWidths = xmlDoc.SelectNodes("/MsBuild:Report/MsBuild:Body/MsBuild:ReportItems/MsBuild:Tablix/MsBuild:TablixBody/MsBuild:TablixColumns/*", nsmgr);                
int indexEpoca = 0;
XmlNode node = listaWidths[indexEpoca];
XmlNode parent = listaWidths[indexEpoca].ParentNode;
parent.RemoveChild(node);

هذه هي خدمات الإبلاغ RDL XML. رمز XML المحدد هنا:

  <Tablix Name="Tablix3">
    <TablixBody>
      <TablixColumns>
        <TablixColumn>
          <Width>1.602in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.61in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6323in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6023in</Width>
        </TablixColumn>
        <TablixColumn>
          <Width>1.6033in</Width>
        </TablixColumn>
      </TablixColumns>
      (...)

لقد جربت كل مجموعة ممكنة ، دون حظ على الإطلاق. ما الخطأ الذي افعله؟ شكرًا لك.

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

المحلول

توثيق SelectNodes يقول بوضوح: "سيكون الكائن XMLNODELIST الذي تم إرجاعه بواسطة هذه الطريقة صالحًا بينما يظل المستند الأساسي دون تغيير. إذا تغيرت المستندات الأساسية ، فقد يتم إرجاع النتائج غير المتوقعة (لن يتم إلقاء أي استثناء)."

لذا فإن ما تواجهه مع XMlNodelist الذي تم إرجاعه من SelectNodes بعد معالجة المستند قد لا يكون ما تتوقعه ولكن يتماشى مع الوثائق. سيتعين عليك الاتصال بـ SelectNodes مرة أخرى للحصول على XMlnodelist جديد إذا قمت بمعالجة المستند.

من وجهة نظري ، ارتكب مصممو تطبيق DOM في إطار .NET خطأ باستخدام XMLNODELIST كطبقة مجردة للتنفيذ الملموس مع سلوك مختلف تمامًا. إذا كنت تستخدم eg childnodes ، فستحصل على قائمة عقدة "Live" بما يتماشى مع ما تتطلبه مواصفات DOM W3C ، لذلك في هذه الحالة ، يغير تغيير المستند قائمة العقدة تلقائيًا (إذا لزم الأمر). ومع ذلك ، تقوم SelectNodes بإرجاع قائمة العقدة بسلوك مختلف تمامًا ، كما واجهت.

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