使用Linq从xml列表中删除项目

时间:2015-05-24 06:08:52

标签: c# xml linq

我有以下xml文件:

<ArrayOfNO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <No>
    <Id>0</Id>
    <Name>txt_0</Name>
    <Texto>Função 0</Texto>
    <Txt_relacionados>
       <string>txt_1</string>
       <string>txt_2</string>
    </Txt_relacionados>
    <Nível>2</Nível>
    <X>393</X>
    <Y>55</Y>
</No>
<No>
    <Id>0</Id>
    <Name>txt_1</Name>
    <Texto>Função 0</Texto>
    <Txt_relacionados>
       <string>txt_0</string>
    </Txt_relacionados>
    <Nível>1</Nível>
    <X>234</X>
    <Y>115</Y>
</No>
<No>
  <Id>1</Id>
  <Name>txt_2</Name>
  <Texto>Função 1</Texto>
  <Txt_relacionados>
    <string>txt_0</string>
  </Txt_relacionados>
  <Nível>1</Nível>
  <X>234</X>
  <Y>115</Y>
</No>
</ArrayOfNO>

我希望在删除元素时(例如"txt2"),程序会在所有元素的<Txt_relacionados>中查找是否有与"txt_2"相关的项目,以及是否真的删除。

我已使用以下代码删除了该项目(正在运行):

public void remove(String name)
    {
        RefreshXDoc();
        var oEmp = doc.Descendants().Elements("No")
            .Where(d => d.Element("Name").Value == name)
            .FirstOrDefault();

        if (oEmp == null)
        {
            return;
        }

        oEmp.Remove();
        SaveXDoc();
    }

但首先需要删除列表中的所有项目&#34; txt_relacionados&#34;与其相关的其他元素(不知道如何实现)。我试过这样的事情:

var oEmp = doc.Descendants("No").Elements("Txt_relacionados")
            .Where(d => d.Element("string").Value == name)
            .ToList();
        oEmp.Remove();

        SaveXDoc();

有人有建议吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

您可以尝试这种方式删除<string>中价值等于<Txt_relacionados>的所有name元素:

doc.Descendants("No")
    .Elements("Txt_relacionados")
    .Elements("string")
    .Where(s => (string)s == name)
    .Remove();

SaveXDoc();

此处不需要ToList(),您可以直接调用扩展方法.Remove(),因为该方法defined for IEnumerable<XNode> source

答案 1 :(得分:0)

首先从xml结构中删除节点,然后保存新的xml结构:

foreach (var node in oEmp)
{
    node.ParentNode.RemoveChild(oEmp);                
}
SaveXDoc();