2008-08-21 39 views
39

Các mã sau đây nên tìm thẻ dự án thích hợp và loại bỏ nó từ XmlDocument, tuy nhiên khi tôi kiểm tra nó, nó nói:nút Loại bỏ từ một XmlDocument

Nút phải được loại bỏ không phải là một đứa trẻ của nút này .

Có ai biết cách thích hợp để thực hiện việc này không?

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); 
      } 
     } 
    } 
} 

CẬP NHẬT

cố định. Tôi đã làm hai việc:

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

Đã thay thế vòng lặp với truy vấn XPath, không phải để sửa chữa nó, chỉ vì đó là cách tiếp cận tốt hơn.

Việc sửa chữa thực tế là:

project.ParentNode.RemoveChild(project); 

Cảm ơn Pat và Chuck cho đề nghị này.

+0

Tôi chỉ đang tìm kiếm thứ này. Tôi đã dành một nửa ngày tìm kiếm các công cụ xml trên internet và nửa phút trên SO. Tuy nhiên, một lý do khác khiến Jeff và Joel phải làm gì đó. –

Trả lời

53

thay vì

configDoc.RemoveChild(projectNodes[i]); 

thử

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

Có thể các nút dự án không phải là nút con, nhưng là cháu hoặc thấp hơn? GetElementsByTagName sẽ cung cấp cho bạn các phần tử từ bất kỳ đâu trong cây phần tử con, IIRC.

0

Nó sẽ được thuận tiện để xem một mẫu của các tập tin XML bạn đang xử lý nhưng tôi đoán sẽ được rằng bạn có một cái gì đó như tin nhắn

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

Các lỗi này có vẻ là vì bạn đang cố gắng loại bỏ <project> từ ông bà chứ không phải là cha mẹ trực tiếp của nút dự án

2

thử

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

Hình như bạn cần phải chọn nút cha của projectNodes [i] trước khi gọi removeChild.

0

Khi bạn nhận được đủ khó chịu bằng cách viết nó một chặng đường dài (đối với tôi đó là khá sớm), bạn có thể sử dụng một phương pháp mở rộng trợ giúp được cung cấp dưới đây. Yay công nghệ mới!

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(); 
Các vấn đề liên quan