2011-10-16 98 views
1

我將如何使用Linq刪除其元素包含參數{}的所有部分?在我的例子我想與{SecName1}刪除Linq的XML文檔部分

源文檔中刪除部分中:

<ReceiptLayoutMaintenanceRequest> 
    <ReceiptLayoutName>Test Layout1</ReceiptLayoutName> 
    <ActionName>Add</ActionName> 
<ReceiptLayoutForMaintenance> 
    <Name>Test Layout1</Name> 
    <Description>ReciptDesc</Description> 
    <PrinterName>Emulator - Receipt</PrinterName> 
    <ReceiptLayout> 
    <Name>AAA</Name> 
    <Description>$</Description> 
    <TemplateName>DefaultTemplate</TemplateName> 
    <LayoutParameters /> 
    </ReceiptLayout> 
    <ReceiptLayout> 
    <Name>{SecName1}</Name> 
    <Description>$</Description> 
    <TemplateName>DefaultTemplate</TemplateName> 
    <LayoutParameters /> 
    </ReceiptLayout> 
</ReceiptLayoutForMaintenance> 
</ReceiptLayoutMaintenanceRequest> 

求購輸出

<ReceiptLayoutMaintenanceRequest> 
    <ReceiptLayoutName>Test Layout1</ReceiptLayoutName> 
    <ActionName>Add</ActionName> 
<ReceiptLayoutForMaintenance> 
    <Name>AAA</Name> 
    <Description>ReciptDesc</Description> 
    <PrinterName>Emulator - Receipt</PrinterName> 
    <ReceiptLayout> 
    <Name>AAA</Name> 
    <Description>$</Description> 
    <TemplateName>DefaultTemplate</TemplateName> 
    <LayoutParameters /> 
    </ReceiptLayout> 
</ReceiptLayoutForMaintenance> 

感謝

回答

2

這消除任何ReceiptLayout節點,其有一個孩子Name開始d用括號結束,併產生所需輸出:

XDocument doc = XDocument.Load(@"test.xml"); //load xml 
var nodesToRemove = doc.Descendants("ReceiptLayout") 
         .Where(x => x.Element("Name").Value.StartsWith("{") 
           && x.Element("Name").Value.EndsWith("}")) 
         .ToList(); 

foreach (var node in nodesToRemove) 
    node.Remove(); 

這可以被縮短到一個LINQ的聲明,我個人更喜歡保持Linq查詢和修改(去除)雖然分開:

doc.Descendants("ReceiptLayout") 
    .Where(x => x.Element("Name").Value.StartsWith("{") 
      && x.Element("Name").Value.EndsWith("}")) 
    .Remove(); 
+0

第一個代碼示例在foreach中給了我'NullReferenceException'。可能它不喜歡你在他的作品中觸摸他的收藏。第二個工程。 – xanatos

+0

在第一個查詢中添加一個ToList應該修復它。 –

+0

@xanatos:不錯,我不知道我是如何忽略這個的 - 在第一個例子中增加了一個ToList(),它解決了這個問題 – BrokenGlass

1
var doc = XDocument.Parse(xml); 
doc.Descendants() 
    .Where(n => !n.HasElements && Regex.IsMatch(n.Value, "[{].*?[}]")) 
    .Select(n=>n.Parent) // because you want to remove the section not the node 
    .Remove(); 
xml = doc.ToString(); 
+0

對不起,但2個答案沒有幫助。仍然我無法刪除此部分( – user681055

+0

)更正了正則表達式 – xanatos

+0

@ user681055中的一個小錯誤,在正則表達式中出現了小故障,請立即嘗試。 –

1

使用let關鍵字

var doc = XDocument.Load(@"test.xml"); 

var list = from p in doc.Descendants("ReceiptLayout") 
      let q = p.Element("Name") 
      let r = q != null ? q.Value : string.Empty 
      where r.StartsWith("{") && r.EndsWith("}") 
      select p; 

list.Remove(); 

的BrokenGlass代碼的變體這是「不成熟的優化」:-)我「緩存」p.Element("Name").Value。啊...我檢查是否確實有一個Name元素,以便在沒有一個元素時一切都不會崩潰:-)