2015-05-24 38 views
0

删除的项目,我有以下XML文件:从XML列表使用LINQ

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

但首先需要从列表中选择“txt_relacionados”那些与之相关的其他元素删除所有项目(不知道如何实现)。我试过这样的事情:

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

     SaveXDoc(); 

任何有建议吗? 谢谢!从XML结构

+0

您需要递归算法,因为每个节点都可能引用其他节点。 – jdweng

回答

2

你可以试试这个办法中<Txt_relacionados>删除所有<string>元素具有值等于name

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

SaveXDoc(); 

无需ToList()这里,你可以直接调用扩展方法.Remove(),因为该方法defined for IEnumerable<XNode> source

+0

@MarcosFreitas欢迎您。并且不要忘记[接受](http://stackoverflow.com/help/someone-answers)答案 – har07

0

先删除节点,然后保存新的XML结构:

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