2014-01-14 92 views
0

元素我的XElement = XDOC无法删除XML

<div id="item123"> 
    <div id="item456"> 
     <h3 id="1483538342"> 
      <span>Dessuten møtte</span> 
     </h3> 
     <p>Test!</p> 
    </div> 
</div> 

当我尝试删除恩与ID项= “item456” 我得到一个错误

System.NullReferenceException: Object reference not set to an instance of an object. 

var item = "456"; 
xDoc.Descendants("div").Where(s => s.Attribute("id").Value == "item" + item).Remove(); 

我可以”不明白这里有什么问题。

+2

'“item”+ item'将搜索属性值'“itemitem456”'。 –

+0

您的xml看起来像html ... –

+0

Adriano,它输入错误。现在它是固定的。谢谢:) – podeig

回答

2

您需要检查当前元素(在where迭代中)是否具有id属性,否则您将访问空对象并获取异常。

var item = "456"; 
xDoc.Descendants("div").Where(s => s.Attribute("id") != null && s.Attribute("id").Value == "item" + item).Remove(); 
+0

看起来你是对的。我再也没有例外。但是这个元素在那里。它不会被删除。 – podeig

+0

该元素是否仍在'xdoc'对象中,或者您在讨论持久保存的文件?你可以通过使用'var elem = xDoc.Descendants(“div”)来检查'Where'是否找到了你的目标元素。Where(s => s.Attribute(“id”)!= null && s.Attribute(“id” ).Value ==“item”+ item).FirstOrDefault();'。如果'elem'为'null',则您的参数(“item456”)可能无效。 –

+0

一切都很好。加工!!!我在wronf的地方检查了结果。感谢您的帮助,安德烈! :) – podeig

1

你的错误意味着一些div元素没有id属性。因此s.Attribute("id")返回null。试图让它的值引发异常。如果你会投属性string,而不是试图访问它的Value,你不会得到错误(如果未找到属性null将返回):

xDoc.Descendants("div") 
    .Where(d => (string)d.Attribute("id") == "item" + item) 
    .Remove(); 

而且这样你正在处理的HTML我建议你使用适当的工具 - HtmlAgilityPack。删除你的div节点将如下所示:

HtmlDocument doc = new HtmlDocument(); 
doc.Load(path_to_file); 
foreach (var div in doc.DocumentNode.SelectNodes("//div[@id='item456']")) 
    div.Remove();