2010-07-09 41 views
8

này loại bỏ tất cả các yếu tố từ tài liệu:nút Loại bỏ từ XDocument

 XDocument document = XDocument.Load(inputFile); 
     foreach (XElement element in document.Elements()) 
     { 
      element.Remove(); 
     } 
     document.Save(outputFile); 

này không có bất kỳ tác:

 XDocument document = XDocument.Load(inputFile); 
     foreach (XElement element in document.Elements()) 
     { 
      //element.Remove(); 
      foreach (XElement child in element.Elements()) 
       child.Remove(); 
     } 
     document.Save(outputFile); 

Tôi có thiếu cái gì ở đây? Vì đây là tất cả các tham chiếu đến các phần tử trong XDocument, nên các thay đổi có hiệu lực không? Có cách nào khác tôi nên được loại bỏ trẻ em lồng nhau từ một XDocument?

Cảm ơn!

+0

Bạn đã sửa lỗi mã? Bạn có chắc chắn rằng element.Elements() trả về các phần tử con không? Chỉ cần tìm kiếm thêm một chút thông tin về chính xác những gì bạn đang thấy xảy ra. – jrista

+0

@jrista Nó trả về các phần tử con, nhưng vấn đề có vẻ là với điều tra viên khác nhau sau một '.Remove()'. – Jake

+1

Vâng, đó là những gì tôi mong đợi. Các điều tra viên thường ném ngoại lệ khi bạn sửa đổi bộ sưu tập, vì chúng rất phụ thuộc vào sự ổn định của bộ sưu tập cơ bản để hoạt động đúng. Tôi thực sự ngạc nhiên bạn có thể tiếp tục sau khi loại bỏ một nút trong khi sử dụng một foreach/enumerator. Tôi thường khuyên bạn nên sử dụng một vòng lặp while (hoặc có thể cho ... nhưng thats phức tạp hơn), chứ không phải là một foreach. – jrista

Trả lời

18

Rõ ràng khi bạn lặp qua element.Elements(), gọi một Remove() trên một trong những trẻ em nguyên nhân điều tra viên số yield break. Lặp lại trên element.Elements().ToList() đã khắc phục được sự cố.

+0

Điều này có cụ thể đối với XPath không? – Neo

+0

@Neo Theo cách nào? Như [jirsta] (http://stackoverflow.com/users/111554/jrista) đã chỉ ra ở trên, hầu hết các điều tra viên sẽ phá vỡ khi thay đổi bộ sưu tập cơ bản. – Jake

+0

Có, tôi biết rằng một InvalidOperationException xảy ra bình thường. Câu hỏi của tôi là về 'ngắt sản lượng'. Điều này cụ thể đối với XPath vis-à-vis bình luận của @ jrista tái im lặng không? – Neo

2

Dưới đây là một ví dụ về một cách khác để sử dụng System.Xml.XPath (thay đổi truy vấn xpath cho phù hợp với nhu cầu của bạn):

const string xml = 
    @"<xml> 
     <country> 
      <states> 
       <state>arkansas</state> 
       <state>california</state> 
       <state>virginia</state> 
      </states> 
     </country> 
    </xml>"; 
XDocument doc = XDocument.Parse(xml); 
doc.XPathSelectElements("//xml/country/states/state[.='arkansas']").ToList() 
    .ForEach(el => el.Remove());; 
Console.WriteLine(doc.ToString()); 
Console.ReadKey(true); 
2

Khi sử dụng XDocument thử này để thay thế:

XDocument document = XDocument.Load(inputFile); 
foreach (XElement element in document.Elements()) 
{ 
    document.Element("Root").SetElementValue(element , null); 
} 
document.Save(outputFile) 

Kính trọng, Todd

Các vấn đề liên quan