【问题标题】:XDocument deleting a nodeXDocument 删除节点
【发布时间】:2010-12-19 04:40:46
【问题描述】:

如何从加载的 XDocument 中删除特定节点?我的 XML 文档如下所示:

<Snippets>
  <Snippet name="if">
    <SnippetCode>      
 if (condition)
 {
 }
    </SnippetCode>
</Snippet>

<Snippets>
  <Snippet name="foreach">
    <SnippetCode>      
 ...
    </SnippetCode>
</Snippet>

....

</Snippets>

如果我只想删除 foreach sn-p,我该怎么做?我尝试了 doc.Descendants.Remove(),但它对我不起作用(节点没有被删除)。

编辑 - 在那张纸条上,我怎样才能重命名 sn-p 并通过代码编辑 sn-ps?我还没有对此进行研究,但我们将不胜感激。

【问题讨论】:

    标签: c# linq-to-xml code-snippets


    【解决方案1】:

    未经测试,但这应该可以。如果您想解释一下,请告诉我。

    xdoc.Descendents("Snippet").Where(xe => xe.Attribute("name") != null 
        && xe.Attribute("name").Value == "foreach").Single().Remove()
    

    【讨论】:

    • 为什么SingleOrDefualt 删除就足够了。
    • @Saeed 我更喜欢确切地知道我要删除的内容,Single 可以防止代码在可能的多个 Snippets 上运行 Remove(),而我只想删除一个。 @Henk 你说的很对,SingleOrDefault 可能是 null.Remove(),我编辑了我的 anwser。
    • @jb, “我更喜欢确切地知道我要删除的内容”,所以你应该用 try catch 包围它并抛出你喜欢的异常,而不仅仅是一行代码(因为可能还有更多超过一项)。
    • 很抱歉回复晚了,但我对此进行了测试,它确实有效。我还想知道 SingleOrDefault 是什么意思,然后我查看了 MSDN 文档,它说如果有多个相同的元素(如果名称相同,我猜),该方法会抛出异常。因此,如果在这种情况下有多个,这可能行不通。无论如何,Single 和 SingleOrDefault 有什么区别?
    • @Iceyoshi,如果超过一项或没有项,Single 会抛出异常,但如果有多个元素或没有元素,SingleOrDefault 返回 null。
    【解决方案2】:

    你可以简单地做到这一点,最后你应该保存文件:

           XDocument doc = XDocument.Load("XmlFile1.xml");
            doc.Descendants("Snippet").Where(p => p.Attribute("name") != null 
                                            && p.Attribute("name").Value == "foreach")
                                            .Remove();
            doc.Save("XmlFile1.xml");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多