2009-05-17 39 views

Trả lời

4

Bạn không thể dễ dàng sử dụng trình vòng lặp (foreach-statement) để xóa các nút của bạn. Như tôi thấy, bạn có thể làm như sau:

1) Trong vòng lặp foreach của bạn, lưu danh sách tất cả các thành phần cần xóa. Sau đó, bạn lặp qua chỉ những yếu tố đó và xóa chúng.

2) Sử dụng vòng lặp thông thường và theo dõi đó là yếu tố tiếp theo cần truy cập sau khi bạn đã xóa một mục.

Chỉnh sửa: Khi sử dụng vòng lặp for làm theo cách mà Fredrik gợi ý, lặp lại ngược.

+1

Upvoting cho câu trả lời đầu tiên; phần 2 có vẻ phức tạp một chút theo cách bạn mô tả nó, nó thường dễ dàng hơn để lặp qua danh sách theo thứ tự ngược lại để bạn không phải lo lắng về chỉ mục tiếp theo. – overslacked

+0

Tại sao tôi thêm ".. theo dõi trong đó là yếu tố tiếp theo để truy cập ..." là bởi vì tôi không biết theo cách nào cho vòng lặp sẽ được thực hiện, nếu các nút theo đúng thứ tự vv –

4

Nếu bạn đang cố xóa một nút khỏi DOM XML, đây không phải là cách chính xác. Bởi vì XMLNodeList chỉ là một danh sách các nút. Thay vào đó bạn muốn loại bỏ nút từ nút cha. Như thế này:

XmlNode parentNode = // some value 
XmlNode drawNode = // some value 
parentNode.ParentNode.RemoveChild(drawNode); 
+1

AFIK , XmlNode "RemoveNode" không tồn tại trong C#. –

+1

Thật vậy, ít nhất là 4.0. Tôi nghĩ rằng ông có nghĩa là: drawNode.ParentNode.RemoveChild (drawNode); Đó là một chút xấu xí nhưng nó làm những gì tôi mong đợi một "loại bỏ" chức năng để làm: zaps drawNode và bất cứ điều gì trong đó. – philw

+0

@philw - Tôi tin rằng bạn là chính xác. Tôi đã chỉnh sửa câu trả lời cho phù hợp –

57

này nên làm các trick cho bạn:

for (int i = nodeList.Count - 1; i >= 0; i--) 
{ 
    nodeList[i].ParentNode.RemoveChild(nodeList[i]); 
} 

Nếu bạn vòng lặp sử dụng thường xuyên cho vòng, và vòng lặp qua nó "ngược", bạn có thể xoá các mục như bạn đi.

Cập nhật: đây là một ví dụ đầy đủ, bao gồm nạp một tập tin xml, định vị các nút, xóa chúng và lưu file:

XmlDocument doc = new XmlDocument(); 
doc.Load(fileName); 
XmlNodeList nodes = doc.SelectNodes("some-xpath-query"); 
for (int i = nodes.Count - 1; i >= 0; i--) 
{ 
    nodes[i].ParentNode.RemoveChild(nodes[i]); 
} 
doc.Save(fileName); 
+0

Không nên nó làm việc khi looped về phía trước cũng ?? – devnull

+1

Trong trường hợp này, nó sẽ hoạt động vì mã không loại bỏ các nút khỏi bộ sưu tập XmlNodeList, nhưng từ DOM XmlDocument, nhưng trong nhiều trường hợp khác, xóa các mục trong một vòng lặp cho trước có thể cho kết quả không mong muốn (chẳng hạn như các mục không được đã xóa). Chuyển động phản xạ, tôi đoán; o) –

+0

Đây là phương pháp lặp đi lặp lại được sử dụng rộng rãi để xóa mục khỏi bộ sưu tập.thanks fredrik cho việc khai sáng mã khôn ngoan cho tất cả :) – Ravisha

1

Không phải là sau một chút đơn giản hơn:

XmlDocument doc = new XmlDocument(); 
doc.Load(fileName); 
XmlNodeList nodes = doc.SelectNodes("some-xpath-query"); 
while (nodes.FirstChild != null) {  
    nodes.RemoveChild(nodes.FirstChild); 
} 
doc.Save(fileName); 
0
XmlNodeList xnodeContact = xmldocContact.GetElementsByTagName("contact"); 
      foreach (ListViewItem item in listViewContacts.Items) 
      { 
       if (item.Checked) 
       { 
        if (item.Index >= 0) 
         xnodeContact[0].ParentNode.RemoveChild(xnodeContact[0]); 
         listViewContacts.Items.Remove(item); 
        } 
       } 
      } 
      xmldocContact.Save(appdataPath + "\\WhatAppcontactList.xml"); 
      Invalidate(); 
Các vấn đề liên quan