2016-03-02 26 views
5

Belirli bir element(path) bir değer içerdiği birden çok düğümü kaldırmaya çalışıyorum ama bir hata alıyorum, bir System.NullReferenceException aldığım bir yere yardım edersem, çok fazla minnettar olurum.C# linq birden çok düğüm silme

Benim xml şöyle görünür:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<ApplicationData Version="12.5.1" RootPath="FireFox-FILES"> 
    <RegistrySystem> 
    <DIR Operation="+" Path="C:\Temp\Microsoft\MediaPlayer\ShimInclusionList" /> 
    <DIR Operation="+" Path="C:\Temp\MediaPlayer\ShimInclusionList\MM.EXE" /> 
    <DIR Operation="+" Path="C:\Temp\MediaPlayer\ShimInclusionList\plugin-container.exe" /> 
    <DIR Operation="+" Path="C:\Temp\Microsoft\MediaPlayer"> 
     <ENTRY Name="" Value="43.0.4" Type="1" /> 
     <ENTRY Name="CurrentVersion" Value="43.0.4 (x86 en-GB)" Type="1" /> 
    </DIR> 
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList\plugin-container.exe" /> 
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList2\plugin.exe" /> 
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList2\container.exe" /> 
    <DIR Operation="+" Path="C:\Program Files\Microsoft\MediaPlayer\ShimInclusionList4"> 
     <ENTRY Name="" Value="43.0.4" Type="1" /> 
     <ENTRY Name="CurrentVersion" Value="43.0.4 (x86 en-GB)" Type="1" /> 
    </DIR> 
    </RegistrySystem> 
</ApplicationData> 

Benim kod şöyle görünür: Yanlış nereye gidiyorum

XDocument xdoc = XDocument.Load(XmlFile); 
foreach (var node in xdoc.Descendants("DIR").Where(status => status.Attribute("Path").Value.Contains(@"C:\Temp\"))) 
{ 
    node.Remove(); 

} 
xdoc.Save(XmlFile); 

emin değilim.

+5

[Ne 'NullReferenceException' ve ben düzeltirim nasıl?] (Http: // stackoverflow .com/q/4660142/447156) –

+0

XML dosyasından yükleme denemesinden sonra 'xdoc' null olabilir mi? – Codor

+0

Üzgünüm Nerede Attribute anlamına gelir. – BillyDay

cevap

6

Neden istisnayı aldığınızı bilmiyorum, ancak bunun nedenini sorguladığınız sırada değiştirdiğinizden şüpheleniyorum.

kaldırmak düğümlerin listesini almak için bir ToList() çağrısı uygulamak için kodunuzu değiştirirseniz

, o atmaz:

foreach (var node in xdoc.Descendants("DIR") 
      .Where(status => status.Attribute("Path").Value.Contains(@"C:\Temp\")) 
      .ToList()) 
{                    
    node.Remove(); 
} 

Ancak, bu iyi bir yol değil. Hiç bir foreach döngü

xdoc.Descendants("DIR") 
    .Where(status => status.Attribute("Path").Value.Contains(@"C:\Temp\")) 
    .Remove(); 

gerek yok: iyi yaklaşım Remove(this IEnumerable<XElement>) extension method kullanmaktır. Şimdi bir Path özniteliği olmadan DIR elemanlarının karşısında onu sağlam hale getirmek için, bunun yerine dizeye yayınlayabilirler:

xdoc.Descendants("DIR") 
    .Where(status => ((string) status.Attribute("Path") ?? "").Contains(@"C:\Temp\")) 
    .Remove(); 
+0

Teşekkürler Jon, sorgu sonunda .Remove() ekleyerek ve onu kaldırarak çözmek için forthe döngü onu düzeltmek için belge çalışırken değiştirmeye çalıştığından şüpheleniyorum. ekledi? boş değerlerin ele alınması. Yardım ettiğin için teşekkür ederim... – BillyDay