2015-05-24 36 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();