سؤال

التعليمة البرمجية التالية يجب أن العثور على المشروع المناسب الوسم وإزالته من XmlDocument ، ولكن عند اختبار ذلك ، فإنه يقول:

العقدة إزالتها ليس الطفل من هذه العقدة.

لا أحد يعرف الطريقة الصحيحة للقيام بذلك ؟

public void DeleteProject (string projectName)
{
    string ccConfigPath = ConfigurationManager.AppSettings["ConfigPath"];

    XmlDocument configDoc = new XmlDocument();

    configDoc.Load(ccConfigPath);

    XmlNodeList projectNodes = configDoc.GetElementsByTagName("project");

    for (int i = 0; i < projectNodes.Count; i++)
    {
        if (projectNodes[i].Attributes["name"] != null)
        {
            if (projectName == projectNodes[i].Attributes["name"].InnerText)
            {                                                
                configDoc.RemoveChild(projectNodes[i]);
                configDoc.Save(ccConfigPath);
            }
        }
    }
}

التحديث

ثابت.فعلت شيئين:

XmlNode project = configDoc.SelectSingleNode("//project[@name='" + projectName + "']");

استبدال حلقة مع استعلام XPath التي لم يكن لتحديد ذلك فقط لأنه كان أفضل نهج.

الفعلية الإصلاح:

project.ParentNode.RemoveChild(project);

شكرا بات تشاك لهذا الاقتراح.

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

المحلول

بدلا من

configDoc.RemoveChild(projectNodes[i]);

محاولة

projectNodes[i].parentNode.RemoveChild(projectNodes[i]);

نصائح أخرى

محاولة

configDoc.DocumentElement.RemoveChild(projectNodes[i]);

يبدو أنك تحتاج إلى تحديد العقدة الأصل من projectNodes[i] قبل استدعاء RemoveChild.

هل من الممكن أن مشروع العقد ليست الطفل العقد ، ولكن الأحفاد أو أقل ؟ GetElementsByTagName سوف تعطيك العناصر من أي مكان في الطفل عنصر الشجرة ، IIRC.

عندما تحصل بما فيه الكفاية انزعجت من كتابة هذا الطريق الطويل (بالنسبة لي أن كان قريبا إلى حد ما) يمكنك استخدام مساعد طريقة التمديد أدناه.ياي التكنولوجيا الجديدة!

public static class Extensions {
    ...
    public static XmlNode RemoveFromParent(this XmlNode node) {
        return (node == null) ? null : node.ParentNode.RemoveChild(node);
    }
}
...
//some_long_node_expression.parentNode.RemoveChild(some_long_node_expression);
some_long_node_expression.RemoveFromParent();

سيكون مفيد لرؤية عينة من ملف XML كنت معالجة ولكن أعتقد أن لديك شيئا من هذا القبيل

<Root>
 <Blah>
   <project>...</project>
 </Blah>
</Root>

رسالة الخطأ يبدو لأنك تحاول إزالة <project> من جد بدلا من الأم مباشرة من عقدة المشروع

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