2013-03-25 3 views
1

Я пытаюсь удалить узел CreditCard в XDocument под названием doc на основании его атрибута name, но он не работает должным образом.вопрос об удалении узла 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

Ваш код ищет "Кредитные карты" с именем, не "CreditCard". Вы также не используете атрибуты в любом месте вашего образца документа.

Попробуйте следующее;

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

мой плохой XDocument неправильно я редактировал его, чтобы представить, что им работать с компанией. это была старая версия. Я заменил элементы в CreditCard атрибутами –

+0

Его работа я только что изменил Element to Attribute и ваш ответ работает. благодаря –

2

В вашем запросе имеется нижнее регистрационное имя атрибута name. Но в вашем xml-названии атрибута есть Name. Xml чувствителен к регистру. Также атрибут Name является дочерним CreditCard элемента, а не CreditCards элементов:

doc.Descendants("CreditCards") 
    .Elements() 
    .Where(c => (string)c.Attribute("Name") == name) 
    .Remove(); 
Смежные вопросы