2013-03-25 49 views
1

我試圖根據其name屬性刪除XDocument中的CreditCard節點doc,但其未按預期工作。問題根據其屬性刪除XDocument節點

doc是我XDocument,它看起來像這樣:

XDocument doc = new XDocument(
       new XComment("XML test file"), 
       new XElement("CreditCards", 
        new XElement("CreditCard", 
         new XAttribute("Name", "TestCard1"), 
         new XAttribute("phoneNumber", 121212142121)), 
        new XElement("CreditCard", 
         new XAttribute("Name", "TestCard2"), 
         new XAttribute("phoneNumber", 6541465561)), 
        new XElement("CreditCard", 
         new XAttribute("Name", "TestCard3"), 
         new XAttribute("phoneNumber", 445588)) 
       ) 
      ); 

這是我嘗試運行查詢,但它不會刪除該節點。 name是一個字符串我通過這個功能作爲參考來告訴它刪除

var q = from node in doc.Descendants("CreditCards") 
         let attr = node.Attribute("name") 
         where attr != null && attr.Value == name 
         select node; 
q.ToList().ForEach(x => x.Remove()); 

我不同意這個得到任何錯誤,但沒有要麼刪除。

回答

1

你的代碼是尋找 「CreditCards」 使用一個名稱,而不是 「信用卡式」。您也不會在示例文檔中的任何位置使用屬性。

請嘗試以下操作;

doc.Descendants("CreditCard") 
    .Where(x => (string)x.Element("Name") == name) 
    .Remove(); 
+0

我壞的XDocument是錯了,我編輯它代表了什麼現在進出口工作。這是舊版本。我用屬性替換CreditCard中的元素 – 2013-03-25 10:41:11

+0

它的工作,我只是將元素更改爲屬性,您的答案正在工作。謝謝 – 2013-03-25 10:49:46

2

在查詢name中有屬性的小寫名稱。但是在你的xml名稱中的屬性是Name。 Xml區分大小寫。此外屬性NameCreditCard元素的孩子,不CreditCards元素:

doc.Descendants("CreditCards") 
    .Elements() 
    .Where(c => (string)c.Attribute("Name") == name) 
    .Remove();