【问题标题】:Can't remove an element in XML无法删除 XML 中的元素
【发布时间】:2014-02-02 09:20:39
【问题描述】:

我有 XElement xDoc =

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

我不明白这里出了什么问题。

【问题讨论】:

  • "item" + item 将搜索属性值"itemitem456"
  • 你的 xml 看起来像 html...
  • 阿德里亚诺,输入错误。现在它是固定的。谢谢:)
  • Sergey,html 是一种 XML。问题不在这里。
  • @podeig 不完全正确 - xml 区分大小写并且它不允许未关闭的标签。因此,有效的 html 可能是无效的 xml,解析会失败。我并没有说这是你的样本中的问题。我只是建议对正确的数据使用正确的工具(见我的回答)。

标签: c# html xml linq xelement


【解决方案1】:

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

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

【讨论】:

  • 看来你是对的。我不再得到例外。但是这个元素仍然存在。它没有被删除。
  • 该元素是否仍在xdoc 对象中,或者您在谈论它被持久化的文件?您可以使用var elem = xDoc.Descendants("div").Where(s =&gt; s.Attribute("id") != null &amp;&amp; s.Attribute("id").Value == "item" + item).FirstOrDefault(); 检查Where 是否找到您的目标元素。如果 elemnull 您的论点(“item456”)可能无效。
  • 一切正常。在职的!!!我在错误的地方检查了结果。谢谢你的帮助,安德烈! :)
【解决方案2】:

您的错误意味着某些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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2015-10-27
    • 2012-02-24
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多